在 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 的后代,内存和线程管理会得到处理。
第一次,我调用 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 的后代,内存和线程管理会得到处理。