我的应用程序在主要活动上有一个刷新按钮。当用户按下该按钮时,将创建一个新线程,该线程开始更新 SQLite 数据库。当这个线程开始时,用户可能会进入应用程序的另一个活动。
问题是当后台线程完成时,应该根据数据库更新这些其他活动(ListActivity)。我怎么能提供。我尝试使用 ActivityManager 获取当前任务,但它需要我不想要的额外权限。
我的应用程序在主要活动上有一个刷新按钮。当用户按下该按钮时,将创建一个新线程,该线程开始更新 SQLite 数据库。当这个线程开始时,用户可能会进入应用程序的另一个活动。
问题是当后台线程完成时,应该根据数据库更新这些其他活动(ListActivity)。我怎么能提供。我尝试使用 ActivityManager 获取当前任务,但它需要我不想要的额外权限。
编辑:
抱歉,好像误会你了。请看下面的代码,它与Chinaski 的类似(您只是为回调方法使用了一个接口),但我添加了更多内容以确保您知道如何以一种避免内存泄漏的方式使用它。
请注意活动在 onDestroy 期间是如何分离的——或者您可以使用 WeakReference,但是这些天您将使用 FragmentsetRetainInstance(true)
并完全避免分离/附加,因为 Fragment 将被保留。
我的异步任务
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();
}
}
我的活动
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
}
}
您可以制作一个单例,其中您将拥有您的线程和一个“任务”队列。当一个任务完成时,你检查/启动下一个任务,当你添加一个任务时,你启动它,或者如果一个任务已经在运行,则将它添加到队列中。
我不是说这是最好的解决方案,但它是一个。