1

私のアプリケーションには、メイン アクティビティに更新ボタンがあります。ユーザーがそのボタンを押すと、SQLite データベースの更新を開始する新しいスレッドが作成されます。このスレッドが開始されると、ユーザーはアプリケーションの別のアクティビティに入る可能性があります。

問題は、バックグラウンド スレッドが完了したときに、これらの他のアクティビティ (ListActivity) を DB に従って更新する必要があることです。どうすればそれを提供できますか。ActivityManager で現在のタスクを取得しようとしましたが、必要のない追加の権限が必要です。

4

2 に答える 2

1

編集:

すみません、誤解していたようです。次のコードを見てください。これは Chinaski のコード (コールバック メソッドにインターフェイスを使用するだけ) に似ていますが、メモリ リークを回避する方法でコードを使用する方法を理解できるように、もう少し追加しました。

onDestroy 中にアクティビティがどのようにデタッチされるかに注意してください。代わりに、WeakReference を使用することもできますが、最近では Fragment を使用し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();

    }
}

マイアクティビティ

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
    }

}
于 2012-07-23T16:22:17.327 に答える
0

スレッドと「タスク」のキューを持つシングルトンを作成できます。タスクが終了したら、次のタスクを確認/起動し、タスクを追加すると、それを起動するか、タスクが既に実行されている場合はキューに追加します。

これが最善の解決策だとは言いませんが、1 つです。

于 2012-07-23T16:15:03.040 に答える