2013-03-08 51 views
1

我有一個需要創建長時間運行的工作線程的活動。此工作線程需要在運行時響應用戶輸入。例如,我需要創建一個名爲'ConstructionWorker'的線程,但是我想根據用戶界面中的按鈕發送一個類似'EatLunch'或'WorkFaster'的命令。工作線程隨後將更新帶有進度的父線程。Android:在這種情況下實施什麼類型的工作線程?

我已經使用AsyncTask實現了這一部分功能,但是我沒有看到創建'WorkSlower'或'WorkFaster'功能的方法,然後我可以從UI線程調用它。

我應該使用什麼類型的線程技術?我猜AsyncTask不是解決這個問題的方法。

回答

1

,你可以用它代替的AsyncTask HandlerThread,

public class TestActivity extends Activity implements OnClickListener { 
private HandlerThread mBackgroundThread; 
private Handler mBackgroundHandler; 

private static final int BACKGROUND_TASK_WORK_SLOWER = 0; 
private static final int BACKGROUND_TASK_WORK_FASTER = 1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_content); 

    Button btnWorkSlower = (Button) findViewById(R.id.work_slower); 
    btnWorkSlower.setOnClickListener(this); 
    Button btnFaster = (Button) findViewById(R.id.work_faster); 
    btnFaster.setOnClickListener(this); 

    mBackgroundThread = new HandlerThread("ConstructionWorker", 
      Process.THREAD_PRIORITY_BACKGROUND); 
    mBackgroundThread.start(); 
    mBackgroundHandler = new Handler(mBackgroundThread.getLooper()) { 
     @Override 
     public void handleMessage(Message msg) { 
      performBackgroundTask(msg.what, msg.obj); 
     } 
    }; 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.work_slower: 
     scheduleBackgroundTask(BACKGROUND_TASK_WORK_SLOWER); 
     break; 
    case R.id.work_faster: 
     scheduleBackgroundTask(BACKGROUND_TASK_WORK_FASTER); 
     break; 
    default: 
     break; 
    } 
} 

protected void scheduleBackgroundTask(int task) { 
    mBackgroundHandler.sendEmptyMessage(task); 
} 

protected void performBackgroundTask(int task, Object arg) { 
    switch (task) { 
    case BACKGROUND_TASK_WORK_SLOWER: { 
     // work slower here 
     break; 
    } 
    case BACKGROUND_TASK_WORK_FASTER: { 
     // work faster here 
     break; 
    } 
    } 
} 

}

+0

這看起來不錯。問題 - 建築工人線程如何溝通進度? – user1532208 2013-03-08 12:59:28

0

使用asynctask作爲後臺線程。

然後創建一個消息隊列。由於您將進行跨線程同步,因此在推送和彈出消息時,請確保在共享數據結構(如隊列本身)周圍使用synchronize()。

讓您的UI線程將消息發佈到隊列中,並讓您的asynctask循環輪詢隊列中的消息。

相關問題