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 回答