Android:为此方案实现哪种类型的工作线程?

时间:2013-03-08 01:56:00

标签: android multithreading

我有一个需要创建长时间运行的工作线程的活动。此工作线程需要在运行时响应用户输入。例如,我需要创建一个名为“ConstructionWorker”的线程,但我想根据UI中的按钮向其发送“EatLunch”或“WorkFaster”等命令。然后,工作线程将使用进度更新父线程。

我已经使用AsyncTask实现了部分内容,但我没有看到创建'WorkSlower'或'WorkFaster'函数的方法,然后我可以从UI线程调用它。

我应该使用什么类型的线程技术?我猜AsyncTask不是解决问题的方法。

2 个答案:

答案 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循环,轮询队列中的消息。