Поток не остановится в onPause - PullRequest
0 голосов
/ 20 декабря 2011

Я пытаюсь остановить свой поток в моем onPause (), но поток все еще работает и получает уведомление, которое отправляется, когда истекает поток. Кажется, у меня все настроено правильно ... Мое уведомление работает нормально и появляется после 8000 сна ... но если пользователь оставляет / onPause () до этого, уведомление все равно появляется.

private static final int MY_NOTIFICATION_ID=1;
     private NotificationManager notificationManager;
     private Notification myNotification;
 Thread timer;

protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        super.onCreate(savedInstanceState);
        setContentView(R.layout.expire);

        timer = new Thread(){
                public void run(){
                    try{
                        sleep(8000);                    
                    } catch (InterruptedException e){
                        e.printStackTrace();
                    }finally{
                        NotificationManager notificationManager =
                                (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
                               myNotification = new Notification(R.drawable.missedcall,
                                 "Exired",
                                 System.currentTimeMillis());
                               Context context = getApplicationContext();
                               String notificationTitle = "Time Expired";
                               String notificationText = "Try next time";
                               Intent myIntent = new Intent();
                               PendingIntent pendingIntent
                                 = PendingIntent.getActivity(CallScreen.this,
                                   0, myIntent,
                                   Intent.FLAG_ACTIVITY_NEW_TASK);
                               myNotification.defaults |= Notification.DEFAULT_SOUND;
                               myNotification.flags |= Notification.FLAG_AUTO_CANCEL;
                               myNotification.setLatestEventInfo(context,
                                  notificationTitle,
                                  notificationText,
                                  pendingIntent);
                               notificationManager.notify(MY_NOTIFICATION_ID, myNotification);
                               finish();


                    }
                }
            };
            timer.start();

}


@Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        timer.stop();
        finish();
        }

Ответы [ 2 ]

0 голосов
/ 20 декабря 2011

Во-первых : Вы хотите, чтобы код в операторе finally всегда выполнялся?Потому что, как написано, вы не сможете выйти из потока без обновления вашего уведомления.

Если все в порядке, просто позвоните timer.interrupt(), что вызовет ваш обработчик InterruptedException, а затем вызовите ваш finally block - если вы не хотите прерывать потоки и действительно чувствуете привязанность к вашему потоку, вы всегда можете использовать защелку для его освобождения.

public class SomeDamnedActivity extends Activity {
    // ... misc junk ...
    private CountDownLatch mLatch;
    private Thread mThread;

    protected void onCreate(Bundle savedInstanceState) {
        mLatch = new CountDownLatch(1);
        mThread = new Thread() {
            public void run() {
                try {
                    mLatch.await(8, TimeUnit.SECONDS);
                } catch (InterruptedException e) {
                    Log.w(TAG, "Interrupted waiting for latch to release", e);
                } finally {
                    // Stuff goes here that you want to execute.
                }
            }
        };      
    }

    protected void onPause() {
        // ...
        mLatch.countDown(); // This will release the latch "prematurely" calling your finally-statement.
    }

(К вашему сведению: AsyncTask, вероятно,лучшая идея или размещение Runnable в View в макете, используя View#postDelayed(Runnable, long))

0 голосов
/ 20 декабря 2011

Просто из любопытства, откуда вы знаете, что onPause () на самом деле вызывается?

Используйте Toast или Log, чтобы узнать, что ваше приложение переходит в состояние onPause ()

...