2015-05-19 17 views
8

Mi occupo di questo problema su Android:Accesso di dominio da thread errato Android

Accesso al dominio da thread non corretto. Gli oggetti di ambito sono accessibili solo sul thread in cui sono stati creati.

voglio usare nel mio regno RemoteViewsFactory con

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 
    } 

}

... Questa chiamata fallito! Perché ?

prelevo i miei dati come questo nella mia classe:

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

ho chiamato il mio remoteFactory in questo modo:

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

Qualche idea?

+1

non ho familiarità con RemoteViewsService, ma a quanto pare il metodo '' 'onDataSetChanged''' viene chiamato da un altro thread che il vostro metodo' '' getViewAt'''. Non sono sicuro se questo a causa di come funziona RemoteViewsService o il tuo codice. –

+0

Ok thxs, come posso ripararlo? – manua27

+0

Per interrompere la limitazione del dominio, è possibile consultare questo post http://stackoverflow.com/questions/26602258/how-to-achieve-the-following-in-realm-for-android/32607241#32607241. mostra il tipo di implementazione del wrapper per liberare la tua applicazione dall'accesso di Reame dall'eccezione di thread errata –

risposta

2

Se il problema è causato da chiamando onDataSetChanged e getViewAt da un altro thread, è possibile forzare loro di utilizzare lo stesso filo, creando il proprio HandlerThread in questo modo:

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]; 
} 

ho copiato Lock classe da questa pagina: http://tutorials.jenkov.com/java-concurrency/locks.html
Non dimenticare di quit il thread del gestore quando le attività sono state completate.

+0

Cosa intendi per "chiudere"? – manua27

+0

Intendevo questo metodo: http://developer.android.com/reference/android/os/HandlerThread.html#quit() Il thread non si ferma a meno che non si chiami il metodo. – usp

0

Sono basato su RxJava, quindi lo faccio in un reame. Faccio clonare ogni oggetto perché fanno parte del thread principale e questo rovina quando lavoro su un altro thread come la schermata iniziale di un widget.

myRealm.where(Dog.class).findAllAsync().subscribe(mainThreadDogs->{ 
     thisThreadDogs.clear(); 

     for(Dog dog: mainThreadDogs){ 
      thisThreadDogs.add(ModelUtil.cloneDog(dog)); 
     }  
}); 
Problemi correlati