在 HandlerThread.quit() 之后第二次调用 HandlerThread.start() 时出现 IllegalThreadStateException

Got IllegalThreadStateException when Invoking HandlerThread.start() second time after HandlerThread.quit()

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

来结束这个线程

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

但是 我得到了 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();
        }
    }
};

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

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

 asyntask.execute();

更多enter link description here

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

但是,您可以多次使用诸如 ExecutorService which will allow you to use the same Runnable 之类的内容。

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