0

第一次,我调用 HandlerThread.start() 来处理后台服务。在所有的东西都完成之后,我想通过调用 HandlerThread.quit() 来结束这个线程。

然后第二次,我启动这个 Handler,并检查了 HandlerThread.isAlive(),isAlive() 返回 false,但是当我通过 HandlerThread.start() 再次调用 HandlerThread 时。

但是我得到了IllegalThreadStateException为什么

在我再次安全地调用 handlerThread.start() 之前,我如何才能真正停止 HandlerThread?

  onCreate(){
  ...............
  CurrentLocationPresenter = 
       new  CurrentLocationPresenter(getApplicationContext(),mHandler);
    }

  public void onClick(View v) {
    int id = v.getId();
    switch (id){
        case  R.id.showplacebutton:
            showPlaceInMapActivity();
            break;

        case  R.id.showgpsbutton:     

            if (mCurrentLocationPresenter.isAlive()){
                break;
            }

            mCurrentLocationPresenter.start();
            break;


    private Handler mHandler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == CurrentLocationPresenter.WHATCODE){

            mCurrentLatlng = (LatLng) msg.obj;
            mTextView.setVisibility(View.VISIBLE);
            if (mCurrentLatlng!=null) {
                mTextView.setText(mCurrentLatlng.toString());
            }
            mCurrentLocationPresenter.getLooper().quit();
        }
    }
};
4

2 回答 2

0

您不能在同一个对象上调用 asyntask.execute() 多个。

总是调用 MyasynTask asyntask=new MyasynTask();

 asyntask.execute();

更多请在此处输入链接描述

于 2015-08-05T13:40:40.513 回答
0

如前所述,您永远不能多次调用线程对象上的 start/run/execute 方法,因为您将获得IllegalThreadStateException

但是,您可以使用诸如ExecutorService之类的东西,这将允许您多次使用相同的Runnable 。

此外,如果您使用ThreadPoolExecutor(它是 ExecutorService 的后代),则会处理内存和线程管理。

于 2015-08-05T14:47:40.430 回答