2013-03-07 26 views
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); 

我不需要任何泄漏的方法,所以我正在尋找正確的方式去完成這項任務。

+0

爲什麼你想建立自己的處理程序? AsyncTask不適合您的需求嗎? – 2013-03-07 13:51:17

+0

@SimonZettervall如何在達賴之後重新啓動AsyncTask?在我的情況下,「**線程**發送_Message_到**處理程序**」 - >「**處理程序**重新啓動**線程**」 – kemmotar 2013-03-07 13:56:08

+0

這是由您來「重新啓動」。線程中沒有這樣的事情。您可以啓動新線程,暫停線程或停止/結束線程。簡歷操作取決於您的代碼。當線程停止時(應用程序暫停),您必須存儲迄今爲止計算的數據。開始時,您將該數據再次傳遞給線程。而且你的算法必須跳過已處理過的部分,以便從上次停止時的點繼續。 – Pihhan 2013-03-07 14:04:34

回答

1

我寫了一些示例代碼,而不是使用AsyncTask,而是讓它的回調函數確定是否應該創建一個新的AsyncTask。請告訴我,如果它是錯誤的。

TestFragment:

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(); 
     } 
    } 
} 
+0

是的,這個工作,可以解決這個問題,但我寫Handler正確的方式 – kemmotar 2013-03-12 13:26:46