领域访问从不正确的线程Android

我在Android上处理这个问题:

领域访问不正确的线程。 领域对象只能在创build的线程上访问。

我想在我的RemoteViewsFactory中使用Realm

public class RemoteViewsX implements RemoteViewsFactory { public RemoteViews getViewAt(int paramInt) { if (this.results != null && this.results.size() != 0 && this.results.get(paramInt) != null) { //FAILED HERE } 

}

…这个电话失败了! 为什么?

我在我的课堂上获取像这样的数据:

 public void onDataSetChanged() { Realm realm = Realm.getInstance(RemoteViewsX.this.ctx); this.results = realm.where(Model.class).findAll(); } 

我打电话给我的这个remoteFactory:

 public class ScrollWidgetService extends RemoteViewsService { @Override public RemoteViewsFactory onGetViewFactory(Intent intent) { return new RemoteViewsX (getApplicationContext()); } } 

任何想法 ?

Solutions Collecting From Web of "领域访问从不正确的线程Android"

如果问题是由另一个线程调用onDataSetChangedgetViewAt引起的,则可以强制它们使用相同的线程,像这样创build自己的HandlerThread

 public class Lock { private boolean isLocked; public synchronized void lock() throws InterruptedException { isLocked = true; while (isLocked) { wait(); } } public synchronized void unlock() { isLocked = false; notify(); } } public class MyHandlerThread extends HandlerThread { private Handler mHandler; public MyHandlerThread() { super("MY_HANDLER_THREAD"); start(); mHandler = new Handler(getLooper()); } public Handler getHandler() { return mHandler; } } public class RemoteViewsX implements RemoteViewsFactory { private MyHandlerThread mHandlerThread; ... } public void onDataSetChanged() { Lock lock = new Lock(); mHandlerThread.getHandler().post(new Runnable() { @Override public void run() { Realm realm = Realm.getInstance(ctx); results = realm.where(Model.class).findAll(); lock.unlock(); } }); lock.lock(); } public RemoteViews getViewAt(int paramInt) { Lock lock = new Lock(); final RemoteViews[] result = {null}; mHandlerThread.getHandler().post(new Runnable() { @Override public void run() { // You can safely access results here. result[0] = new RemoteViews(); lock.unlock(); } }); lock.lock(); return result[0]; } 

我从这个页面复制Lock类: http : //tutorials.jenkov.com/java-concurrency/locks.html
任务完成后,不要忘记quit处理程序线程。

我基于RxJava,所以我在这个领域做了这个。 我克隆每个项目,因为他们是主线程的一部分,当我在另一个线程,如小工具主屏幕工作时,弄乱了。

 myRealm.where( Dog.class ).findAllAsync().subscribe( mainThreadDogs->{ thisThreadDogs.clear(); for( Dog dog: mainThreadDogs ){ thisThreadDogs.add( ModelUtil.cloneDog( dog ) ); } });