0

finish()を呼び出してアクティビティを破棄しましたが、アクティビティを破棄した後もアクティビティ内のスレッドが実行されているため、アプリケーションがクラッシュします。これを処理するにはどうすればよいですか?アクティビティを破棄した後にスレッドが実行されるのはなぜですか?助けてください。

class DBThread extends Thread {

    @Override
    public void run() {
        while (finish) {
            Cursor cursor = null;

            Cursor mCursor = lrDB.selectUserDetails(mUser_Id);
            if (mCursor.getCount() > 0) {
                mCursor.moveToNext();
                String Name = mCursor .getString(0);
                String userName = mCursor .getInt(1);
                String password = mCursor .getString(3);

            }
            mCursor.close();

        }
    }
}
4

6 に答える 6

3

最初にスレッドを修正します。

class DBThread extends Thread { 
    @Override 
    public void run() { 
        while (!isInterrupted()) {
            Cursor mCursor = lrDB.selectUserDetails(mUser_Id); 
            if (mCursor.getCount() > 0) { 
                mCursor.moveToNext(); 
                String Name = mCursor .getString(0); 
                String userName = mCursor .getInt(1); 
                String password = mCursor .getString(3); 

            } 
            mCursor.close(); 
        } 
    } 
} 

次に、スレッドを優雅に閉じるには、アクティビティでそのようなことを行います。

@Override
public void onDestroy() {
    if (yourThread!=null) {
        yourThread.interrupt(); // request to terminate thread in regular way
        yourThread.join(500); // wait until thread ends or timeout after 0.5 second
        if (yourThread.isAlive()) {
            // this is needed only when something is wrong with thread, for example hangs in ininitive loop or waits to long for lock to be released by other thread.
            Log.e(TAG, "Serious problem with thread!");
            yourThread.stop();
        }
    }
    super.onDrestroy();
}

Thread.destroy()は非推奨であり、機能しないことに注意してください。

于 2012-07-18T12:22:58.763 に答える
1

Threadrunメソッドを終了すると、stopが実行されます。だから、あなたが次のようなパターンを持っているなら

public void run() {
  while(condition) {
    // exec
  }
}

スレッドに実行を終了させるために、に設定conditionすることを忘れないでくださいfalse

class DBThread extends Thread {

private boolean finish = true;    

public void stopThread() {
   finish = false;
}

@Override
public void run() {
    while (finish) {
        Cursor cursor = null;

        Cursor mCursor = lrDB.selectUserDetails(mUser_Id);
        if (mCursor.getCount() > 0) {
            mCursor.moveToNext();
            String Name = mCursor .getString(0);
            String userName = mCursor .getInt(1);
            String password = mCursor .getString(3);

        }
        mCursor.close();

    }
 }
}

onDrestroy()通話中yourThreadInstance.stopThread();

于 2012-07-18T07:51:28.843 に答える
1

次のコードを追加します。

@Override
    protected void onDestroy() {
        thread.stop();
        thread.destroy();
        super.onDestroy();
    }
于 2012-07-18T08:07:22.880 に答える
0
@Override     
protected void onStop() {
         thread.stop();
           super.onDestroy();
 }


 @Override     
protected void onPouse() {
         thread.stop();
        super.onDestroy();
}
于 2012-07-18T08:18:51.493 に答える
0

この状況は、onStopまたはonDestroyメソッドで処理できます。onDestroyメソッドでスレッドを中断します。

于 2012-07-18T07:50:43.003 に答える
0

実行中のスレッドの割り込み関数を呼び出し、isInterrupted()関数を使用して割り込みが発生したかどうかをスレッドで確認し、それに応じて続行できます。

于 2012-07-18T12:06:27.523 に答える