2012-07-23 102 views
1

我的應用程序在主要活動上有一個刷新按鈕。當用戶按下該按鈕時,會創建一個新的線程來開始更新SQLite數據庫。當這個線程開始時,用戶可能會進入應用程序的另一個活動。Android更新當前活動從後臺線程

問題是這些其他活動(ListActivity)應該根據數據庫更新後臺線程完成。我怎麼能提供這一點。我嘗試使用ActivityManager獲取當前任務,但它需要額外的權限,我不想要。

+0

使用的AsyncTask內的處理程序。 – 2012-07-24 14:25:36

回答

1

編輯:

對不起,我似乎誤解了你。請看下面的代碼,它類似於Chinaski的(你只是使用一個接口來實現回調方法),但我增加了一些,以確保你知道如何以避免內存泄漏的方式使用它。

請注意活動在onDestroy期間是如何分離的 - 或者您可以使用WeakReference,但是現在您可以使用帶有setRetainInstance(true)的片段,並且完全避免了片段被保留的分離/附加。

MyAsyncTask

public class MyAsyncTask extends AsyncTask<Void, Void, Void> { 

    private Callback mCallback; 

    private boolean mIsComplete = false; 

    private boolean mHasCallbackBeenCalled = false; 

    public MyBackgroundTask(Callback callback) { 
     mCallback = callback; 
    } 

    /** Only safe to call this from the UI thread */ 
    public void attach(Callback callback) { 
     mCallback = callback; 

     if (mIsComplete && !mHasCallbackBeenCalled) { 
      fireCallback(); 
     } 
    } 

    /** Only safe to call this from the UI thread */ 
    public void detach() { 
     mCallback = callback; 
    } 

    @Override 
    public void doInBackground() { 
     // do the heavy stuff here 
     return null; 
    } 

    @Override 
    public void onPostExecute(Void result) { 
     mIsComplete = true; 
     fireCallback(); 
    } 

    private void fireCallback() { 
     if (mCallback != null) { 
      mCallback.callbackMethod(); 
      mHasCallbackBeenCalled = true; 
     } 
    } 

    public static interface Callback { 

     public void callbackMethod(); 

    } 
} 

MyActivity

public class MyActivity extends Activity implements MyAsyncTask.Callback { 

    private MyAsyncTask mTask; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Check for a retained task after a configuration change 
     // e.g. a rotation 
     if (getLastNonConfigurationInstance() != null) { 
      mTask = (MyAsyncTask) getLastNonConfigurationInstance(); 
      // Re-attach the task 
      mTask.attach(this); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     // Detach from task to avoid memory leak 
     if (mTask != null) { 
      mTask.detach(); 
     } 

     super.onDestroy(); 
    } 

    @Override 
    public Object onRetainNonConfigurationInstance() { 
     // Retain the async task duration a rotation 
     return mTask; 
    } 

    /** Callback method */ 
    @Override 
    public void callbackMethod() { 
     // Do something here 
    } 

} 
+0

我很抱歉,但我不明白這個解決方案是否解決了我的問題。我的問題是更新任何活動的用戶界面,說B(我們不知道它是否也可能是C,D,E等),在另一個活動的線程內,說A. – yslr 2012-07-23 17:55:56

+0

對不起,我誤解了。請看我修改後的帖子。 – 2012-07-24 14:23:47

0

你可以創建一個你將擁有你的線程和一個「任務」隊列的單例。任務完成後,您將檢查/啓動下一個任務,並在添加任務時啓動它,或者在任務已經運行的情況下將其添加到隊列中。

我不認爲這是最好的解決方案,但它是一個。

+0

謝謝你的回答。實際上,我認爲那一個,但是,正如你所提到的,我不確定它是否是一個好的解決方案。我正在尋找一個使用android系統類/函數的解決方案。 – yslr 2012-07-23 16:19:37