我的應用程序在主要活動上有一個刷新按鈕。當用戶按下該按鈕時,會創建一個新的線程來開始更新SQLite數據庫。當這個線程開始時,用戶可能會進入應用程序的另一個活動。Android更新當前活動從後臺線程
問題是這些其他活動(ListActivity)應該根據數據庫更新後臺線程完成。我怎麼能提供這一點。我嘗試使用ActivityManager獲取當前任務,但它需要額外的權限,我不想要。
我的應用程序在主要活動上有一個刷新按鈕。當用戶按下該按鈕時,會創建一個新的線程來開始更新SQLite數據庫。當這個線程開始時,用戶可能會進入應用程序的另一個活動。Android更新當前活動從後臺線程
問題是這些其他活動(ListActivity)應該根據數據庫更新後臺線程完成。我怎麼能提供這一點。我嘗試使用ActivityManager獲取當前任務,但它需要額外的權限,我不想要。
編輯:
對不起,我似乎誤解了你。請看下面的代碼,它類似於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
}
}
我很抱歉,但我不明白這個解決方案是否解決了我的問題。我的問題是更新任何活動的用戶界面,說B(我們不知道它是否也可能是C,D,E等),在另一個活動的線程內,說A. – yslr 2012-07-23 17:55:56
對不起,我誤解了。請看我修改後的帖子。 – 2012-07-24 14:23:47
你可以創建一個你將擁有你的線程和一個「任務」隊列的單例。任務完成後,您將檢查/啓動下一個任務,並在添加任務時啓動它,或者在任務已經運行的情況下將其添加到隊列中。
我不認爲這是最好的解決方案,但它是一個。
謝謝你的回答。實際上,我認爲那一個,但是,正如你所提到的,我不確定它是否是一個好的解決方案。我正在尋找一個使用android系統類/函數的解決方案。 – yslr 2012-07-23 16:19:37
使用的AsyncTask內的處理程序。 – 2012-07-24 14:25:36