2016-02-26 52 views
2

我正在使用Realm來爲我的database處理我的Android Application。 但是,當我嘗試從Runnable添加/刪除RealmChangeListener時,我得到exception領域:在Runnable中使用RealmChangeListener

java.lang.IllegalStateException:你不能刪除/從非彎針線

註冊監聽 如果我不使用可運行它的正常工作。下面 是我的代碼:

public void clearDatabase(final RealmChangeListener realmChangeListener) { 
     Realm realm = RealmManager.getNewInstance().getRealm(); 
     realm.addChangeListener(realmChangeListener); 
     realm.beginTransaction(); 
     realm.clear(RBooking.class); 
     realm.commitTransaction(); 
    } 

工作代碼:

protected void clearData() { 
     mDatabaseManager.clearDataBase(new RealmChangeListener() { 
      @Override 
      public void onChange() { 
       TLog.d("Feb 23 : Database has been clean completed!"); 
      } 
     }); 
    } 

編輯:更新工作代碼:

protected void processLogout() { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       Looper.prepare(); 

       mDatabaseManager.clearDataBase(new RealmChangeListener() { 
        @Override 
        public void onChange() { 
         TLog.d("Feb 23 : Database has been clean completed!"); 
        } 
       }); 
       Looper.loop(); 
      } 
     }; 
     doTask(runnable); // excute the runnable 
    } 

所以任何機構可以幫我使RealmChangeListener在Runnable上正確工作。謝謝。

回答

0

使用您正在傳遞給doTask()方法的可運行代碼創建一個處理程序。然後在你的工作者線程中調用處理程序。這樣可以在UI線程中執行runnable。

像:

private Handler messageHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     mDatabaseManager.clearDataBase(new RealmChangeListener() { 
      @Override 
      public void onChange() { 
       TLog.d("Feb 23 : Database has been clean completed!"); 
      } 
     }); 
    } 
}; 

然後在工作線程調用這個處理程序:

new Thread() { 
    public void run() { 
     messageHandler.sendEmptyMessage(0); 
    } 
}.start(); 
1

調用Loop.loop()實際上阻止該線程作爲該行是開始處理線程事件隊列中的線,所以這就是爲什麼你的例子不起作用。

這是不完全清楚爲什麼你需要在這種情況下,RealmChangeListener?,但如果你真的需要他們,你可以使用一個HandlerThreadhttp://developer.android.com/reference/android/os/HandlerThread.html來代替普通的Thread。 HandlerThread有一個活套,所以更改監聽器將對這些工作。

+0

嗨@Christian,有沒有什麼辦法可以將我的偵聽器添加到Runnable而不是HandlerThread? –

+0

如果runnable運行在標準線程上,但不是爲了不只是在LooperThread上執行runnable? –

+0

我執行Service中的runnable,我認爲Service可能被稱爲LooperThread的一種,那是錯的嗎? –