1

Handlerでこれを実行しようとしていますが、Handlerを静的にしたいので、startThreadメソッドを使用できません。

これはハンドラーです

private class ServiceHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        Integer tmp = msg.what;
        Log.d(Tag, tmp.toString());
        switch (msg.what) {
        case THREAD_SYNC_START:
            startSyncThread();
            break;
        case THREAD_SYNC_STOP:
            mSyncThread.interrupt();
            break;
        default:
            break;
        }
    }
}

これは、スレッドを開始するための私のサービスの方法です

private void startSyncThread() {
    if (mSyncThread != null) mSyncThread.interrupt();
    mSyncThread = new SyncThread();
    mSyncThread.start();
}

スレッド送信メッセージをハンドラーに送信

        mServiceHandler.sendEmptyMessageDelayed(THREAD_SYNC_START, 2000);

リークは必要ないので、このタスクを実行する正しい方法を探しています。

4

1 に答える 1

1

代わりに AsyncTask を使用し、新しい AsyncTask を作成する必要があるかどうかをコールバックに判断させるサンプル コードをいくつか書きました。それが間違っているかどうか教えてください。

テストフラグメント:

public class TestFragment extends Fragment {
    private Handler mHandler;

    /*
     * Skipping most code and I will only show you the most essential.
     */

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

        mHandler = new Handler();

        startAsyncTask(0);
    }

    private void startAsyncTask(long milisecondsToDelay) {
        mHandler.postDelayed(new Runnable() {

            @Override
            public void run() {
                TestAsyncTask testAsyncTask = new TestAsyncTask(new FragmentCallback() {

                    @Override
                    public void onTaskDone() {
                        startAsyncTask(1000);
                    }
                });

                testAsyncTask.execute();
            }
        }, milisecondsToDelay);

    }

    public interface FragmentCallback {
        public void onTaskDone();
    }
}

TestAsyncTask:

public class TestAsyncTask extends AsyncTask<Void, Void, Void> {
    private boolean mShouldCreateNewAsyncTask;
    private FragmentCallback mFragmentCallback;

    public TestAsyncTask(FragmentCallback fragmentCallback) {
        mFragmentCallback = fragmentCallback;
    }

    @Override
    protected Void doInBackground(Void... params) {
        /*
         * Do your loop or whatever and when you need to restart it set
         * mShouldCreateNewAsyncTask = true and return null.
         */

        mShouldCreateNewAsyncTask = true;

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        if (mShouldCreateNewAsyncTask) {
            mFragmentCallback.onTaskDone();
        }
    }
}
于 2013-03-07T14:09:41.790 に答える