0

特定のプロセスのスレッドを作成し、進行ダイアログと同時にこのスレッドを実行しています。プロセスが完了すると、進行状況ダイアログが閉じます。これまで問題はありませんが、ユーザーが電話の戻るボタンを 2 回押すと、アクティビティが破棄され、プロセスが停止するはずです。そのため、onDestroy() でスレッドを停止しました。しかし、私のコードでアプリがクラッシュしmt.stop()、エラーログは次のとおりです。解決策を教えてください。また、可能であれば、この背後にある理由が必要です。フラグを使用すると、プロセスは各反復の開始時にのみ停止をチェックします。プロセスを著しく停止したい。

コード

Button b;
ProgressDialog pd = null;
MyThread mt;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b = (Button) findViewById(R.id.btn_start);
    b.setOnClickListener(this);
}

public void onClick(View v) {
    pd = ProgressDialog.show(this, "one", "two", true, true);
    mt = new MyThread();
    mt.start();
}

class MyThread extends Thread {
    @Override
    public void run() {
        // assume this loop is my process.
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Log.v("log_tag", "" + i);
        }
        Log.v("log_tag", "process COmplited");
        pd.dismiss();
        super.run();
    }
}

@Override
protected void onDestroy() {
    Log.v("log_tag", "OnDestroy");
    pd.dismiss();
    mt.stop();
    super.onDestroy();
}

ログ猫のエラー。

11-09 17:26:45.313: E/global(594): Deprecated Thread methods are not supported.
11-09 17:26:45.313: E/global(594): java.lang.UnsupportedOperationException
11-09 17:26:45.313: E/global(594):  at java.lang.VMThread.stop(VMThread.java:85)
11-09 17:26:45.313: E/global(594):  at java.lang.Thread.stop(Thread.java:1379)
11-09 17:26:45.313: E/global(594):  at java.lang.Thread.stop(Thread.java:1344)
11-09 17:26:45.313: E/global(594):  at com.example.threaddemo.MainActivity.onDestroy(MainActivity.java:53)
11-09 17:26:45.313: E/global(594):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642)
11-09 17:26:45.313: E/global(594):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673)
11-09 17:26:45.313: E/global(594):  at android.app.ActivityThread.access$2900(ActivityThread.java:125)
11-09 17:26:45.313: E/global(594):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
11-09 17:26:45.313: E/global(594):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-09 17:26:45.313: E/global(594):  at android.os.Looper.loop(Looper.java:123)
11-09 17:26:45.313: E/global(594):  at android.app.ActivityThread.main(ActivityThread.java:4627)
11-09 17:26:45.313: E/global(594):  at java.lang.reflect.Method.invokeNative(Native Method)
11-09 17:26:45.313: E/global(594):  at java.lang.reflect.Method.invoke(Method.java:521)
11-09 17:26:45.313: E/global(594):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-09 17:26:45.313: E/global(594):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-09 17:26:45.313: E/global(594):  at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

0

私の解決策を参照してください: アンドロイド アクション バー イベントで特定のスレッドを殺す

スレッドの代わりに TimerTask を使用するソリューションは、目的をより適切に最適化することができます。

キャンセルでもうまくいきます:)

PS: が機能stopしない理由についての情報も含まれています。

于 2012-11-10T05:10:14.320 に答える