0

サービス内のスレッドを使用するAndroidアプリケーションを構築しようとしましたが、サービスとスレッドはうまく動作しますが、サービスを停止して破棄してもスレッドはまだ生きているので、アプリケーションを再度実行すると2つのスレッドがありますアプリケーションなので、スレッドを破棄する方法を知りたいです。誰でも私が問題を解決するのを助けることができますか?

ここに私のサービスクラス:

public class MyService extends Service{
    Handler handler;
    static String toast_msg;
    Thread t;
    private static final String TAG = "MyService";

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "Congrats! MyService Created", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onStart(Intent intent, int startId) {
       /* Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStart");
    //Note: You can start a new thread and use it for long background processing from here.*/
        toast_msg = "Horas";
        super.onStart(intent, startId);


        Toast.makeText(getApplicationContext(), toast_msg, Toast.LENGTH_LONG)
                .show();

         handler = new Handler() {
            public void handleMessage(android.os.Message msg) {
                super.handleMessage(msg);
                Toast.makeText(getApplicationContext(), toast_msg,
                        Toast.LENGTH_LONG).show();
            }
        };

        t = new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    try { 
                        t.sleep(5000);
                        // Toast.makeText(getApplicationContext(), "Horas",
                        // Toast.LENGTH_LONG).show();
                        handler.sendEmptyMessage(0);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t.start();
    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");
        //t.interrupt();
        handler.removeCallbacks(t);
        super.onDestroy();
        t.currentThread().interrupt();
    }



}
4

2 に答える 2

1
t = new Thread(new Runnable() {

        @Override
        public void run() {
            while (true) {
                try { 
                    if(flag){//here add a flag
                      return;
                    }
                    t.sleep(5000);
                    // Toast.makeText(getApplicationContext(), "Horas",
                    // Toast.LENGTH_LONG).show();
                    handler.sendEmptyMessage(0);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    });
    t.start();

public void onDestroy() {
    Toast.makeText(this, "MyService Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");
    //t.interrupt();
    handler.removeCallbacks(t);
    super.onDestroy();
    flag = false;//here set flag to false
}
于 2013-07-17T03:21:30.387 に答える
0

代わりに Service または IntentService の使用を検討することをお勧めします。これらは、スレッドの管理、一時停止、再起動などをより適切に提供するためです。

Android IntentServiceのドキュメント、またはこの他のStackOverflowの質問と回答のセッションを参照してください。Android API/SDK によって提供されるより優れたスレッド化/サービス管理機能があるため、最近では独自のスレッドを開始する必要はあまりありません。

これらは、生のスレッドをスピンアップして自分で管理しようとするよりも、はるかに安定しており、最適化されており、(私の意見では) きちんとクリーンに使用できます。特に、バッテリーが切れたためにアプリが突然強制終了された場合に対応していない場合はなおさらです。またはユーザーが予期しないことをしている。

于 2013-07-17T03:29:41.553 に答える