2013-07-17 3 views
0

Я попытался создать приложение для Android, которое использует поток внутри службы, службы и потока с хорошо работает, но когда я останавливаю и уничтожаю службу, live, поэтому, когда я снова запускаю приложение, в приложении есть 2 потока, поэтому я wannt знаю, как я могу уничтожить поток. Кто-нибудь может помочь мне решить проблему?Android: Thread по-прежнему работает навсегда, хотя служба уже уничтожает

здесь мой класс обслуживания:

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(); 
    } 



} 

ответ

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 
} 
+0

Это действительно решает его непосредственную проблему, но я предложил то, что, по моему мнению, было бы лучшим подходом ниже :) – wislon

+0

Это работа и хорошо работает, я думаю, что это полезно для других, таких как я, спасибо – user2548784

+0

Переменная флагов используется для двух разных потоков, поэтому весь доступ к нему должен быть синхронизирован, чтобы гарантировать правильное поведение. – Kai

0

Вы можете рассмотреть возможность использования службы или IntentService вместо этого, так как они обеспечивают более эффективное управление потоками, остановки, перезапуск и т.д.

Смотрите Android IntentService документации или других вопросов StackOverflow вопрос и ответ. В наши дни не так много вызовов, чтобы начинать свои собственные потоки, так как есть лучшие функции управления потоками/сервисами, предоставляемые Android API/SDK.

Они более стабильны, оптимизированы и, по моему мнению, более аккуратными и чистыми, чем прячутся сырые потоки и пытаются управлять им самим, особенно если вы не можете прислушиваться к своему приложению, внезапно убиваемому, потому что батарея разрядилась или пользователь сделал что-то неожиданное.

+2

Служба _ (кроме IntentService, но OP использует начальную службу) _ работает по потоку пользовательского интерфейса по умолчанию, поэтому создание нового потока вполне приемлемо. http://developer.android.com/reference/android/app/Service.html «Обратите внимание, что службы, такие как другие объекты приложения, ** запускаются в основном потоке их хостинга **. Это означает, что если ваш сервис будет делать любой интенсивный процессор (например, воспроизведение MP3) или блокировать (например, сетевые) операции **, он должен создать свою собственную нить **, в которой для этой работы ». – korsosa

Смежные вопросы