我有一个需要创建长时间运行的工作线程的活动。此工作线程需要在运行时响应用户输入。例如,我需要创建一个名为“ConstructionWorker”的线程,但我想根据UI中的按钮向其发送“EatLunch”或“WorkFaster”等命令。然后,工作线程将使用进度更新父线程。
我已经使用AsyncTask实现了部分内容,但我没有看到创建'WorkSlower'或'WorkFaster'函数的方法,然后我可以从UI线程调用它。
我应该使用什么类型的线程技术?我猜AsyncTask不是解决问题的方法。
答案 0 :(得分:1)
您可以使用HandlerThread而不是AsyncTask,
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;
}
}
}
}
答案 1 :(得分:0)
使用asynctask作为后台线程。
然后创建一个消息队列。正如您将要进行跨线程同步一样,请确保在推送和弹出消息时对共享数据结构(例如队列本身)使用synchronize()。
让您的UI线程将消息发布到队列中,并使用asynctask循环,轮询队列中的消息。