1

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

我已经使用 AsyncTask 实现了其中的一部分,但我看不到创建“WorkSlower”或“WorkFaster”函数的方法,然后我可以从 UI 线程调用这些函数。

我应该为此使用哪种类型的线程技术?我猜 AsyncTask 不是解决它的方法。

4

2 回答 2

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;
    }
    }
}

}

于 2013-03-08T02:31:04.827 回答
0

为后台线程使用异步任务。

然后创建一个消息队列。由于您将进行跨线程同步,因此请确保在推送和弹出消息时围绕共享数据结构(例如队列本身)使用 synchronize()。

让您的 UI 线程将消息发布到队列中,并让您的 asynctask 循环,轮询队列中的消息。

于 2013-03-08T02:09:52.290 回答