Android Update后台线程的当前活动

时间:2012-07-23 16:08:22

标签: android

我的应用程序在主要活动上有一个刷新按钮。当用户按下该按钮时,将创建一个新线程,该线程开始更新SQLite数据库。当这个线程启动时,用户可能会进入该应用程序的另一个活动。

问题是当后台线程完成时,应根据DB更新这些其他活动(ListActivity)。我怎么能提供这个。我尝试使用ActivityManager获取当前任务,但它需要额外的权限,这是我不想要的。

2 个答案:

答案 0 :(得分: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
    }

}

答案 1 :(得分:0)

你可以创建一个单例,你将拥有你的线程和一个“任务”队列。任务完成后,检查/启动下一个任务,当您添加任务时,启动它,或者如果任务已在运行,则将其添加到队列中。

我不是说这是最好的解决方案,但它只是一个。