0

初めて、バックグラウンド サービスを処理するために HandlerThread.start() を呼び出します。すべての作業が完了したら、HandlerThread.quit() を呼び出してこのスレッドを終了したいと思います。

次に、この Handler を 2 回目に開始し、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

同じオブジェクトで ayntask.execute() を複数呼び出すことはできません。

常に MyasynTask asyntask=new MyasynTask(); を呼び出します。

 asyntask.execute();

詳細については、ここにリンクの説明を入力してください

于 2015-08-05T13:40:40.513 に答える
0

前述のように、 IllegalThreadStateExceptionが発生するため、スレッド オブジェクトで start/run/execute メソッドを複数回呼び出すことはできません。

ただし、同じRunnableを複数回使用できるようにするExecutorServiceなどを使用できます。

また、 ExecutorService の子孫であるThreadPoolExecutorを使用すると、メモリとスレッドの管理が行われます。

于 2015-08-05T14:47:40.430 に答える