android - service里定时弹窗,弹窗不能点击
怪我咯
怪我咯 2017-04-17 17:58:42
0
1
723

我这里有一个service是这样,开启后,每一分钟做一次弹窗提醒(闹钟app的铺垫,每天一次弹窗提醒)。
然而,我的这个dialog有一个PositiveButton,但是这要点击这个 button 就会报错.
错误如下:

Handler (com.android.internal.app.AlertController$ButtonHandler) {385957f} sending message to a Handler on a dead thread
                                                               java.lang.IllegalStateException: Handler (com.android.internal.app.AlertController$ButtonHandler) {385957f} sending message to a Handler on a dead thread
                                                                   at android.os.MessageQueue.enqueueMessage(MessageQueue.java:555)
                                                                   at android.os.Handler.enqueueMessage(Handler.java:707)
                                                                   at android.os.Handler.sendMessageAtTime(Handler.java:609)
                                                                   at android.os.Handler.sendMessageDelayed(Handler.java:579)
                                                                   at android.os.Handler.sendMessage(Handler.java:516)
                                                                   at android.os.Message.sendToTarget(Message.java:429)
                                                                   at com.android.internal.app.AlertController$1.onClick(AlertController.java:146)
                                                                   at android.view.View.performClick(View.java:5265)
                                                                   at android.view.View$PerformClick.run(View.java:21534)
                                                                   at android.os.Handler.handleCallback(Handler.java:815)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                   at android.os.Looper.loop(Looper.java:207)
                                                                   at android.app.ActivityThread.main(ActivityThread.java:5728)
                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)

我的代码是这样的:

public class ClockService extends IntentService {

    private static final String TAG = "ClockService";
    private Vibrator vibrator;
    private MediaPlayer mMediaPlayer = null;
    private Context mContext ;
    AlertDialog dialog;;
    private static final int TIME = 1000*20;

    public static Intent newIntent(Context context){

        return new Intent(context,ClockService.class);
    }

    public ClockService() {
        super(TAG);
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        LogUtil.d(TAG,"service intent ");
        System.out.println("我是闹钟,我要叫醒你...");
        
        dismissHandler= new Handler(getMainLooper());
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("闹钟");
        builder.setMessage("测试");
        builder.setPositiveButton("知道了", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                //我这里啥都没有,但是只要点击 知道了 就会报错
            }
        });
        dialog = builder.create();
        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

        mHandler =new Handler(Looper.getMainLooper());

        new Thread(){
            @Override
            public void run() {
                super.run();
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        dialog.show();
                    }
                });
            }
        }.start();
       // dialog.show();

    }

    Handler mHandler,dismissHandler ;

    public static void setServiceAlarm(Context context,boolean isON){
        Intent i = ClockService.newIntent(context);
        PendingIntent pi = PendingIntent.getService(context,0,i,0);

        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        if (isON){
            alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),TIME,pi);
        }else{
            alarmManager.cancel(pi);
            pi.cancel();
        }
    }


}
怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(1)
大家讲道理

onHandleIntent()是在子執行緒中執行的,該方法執行完之後,IntentService會立即呼叫stopSelf(),把自己停掉,同時子執行緒的Looper也就被銷毀了。
在onHandleIntent()中建立的Dialog,其內部的ButtonHandler綁定到了子執行緒的訊息佇列,當點擊按鈕事件發生時,子執行緒已經銷毀並退出訊息循環了,那麼ButtonHandler也就失效了。因此,向死亡線程的Handler發送訊息,就會拋出Logcat中的例外。這個異常是在android.os.MessageQueue.enqueueMessage()方法中拋出的,
樣例程式碼如下

if (mQuitting) {
    IllegalStateException e = new IllegalStateException(
            msg.target + " sending message to a Handler on a dead thread");
    Log.w(TAG, e.getMessage(), e);
    msg.recycle();
    return false;
}

Dialog的建立需要在主執行緒操作。建議你啟動一個普通的Service,而不是IntentService,在onStartCommand()方法中建立Dialog即可。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板