0

使用以下代码:

private void showDialog(String message) {
    try
    {
    Looper.prepare();
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            try {
                Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                Ringtone r = RingtoneManager.getRingtone(context.getApplicationContext(), notification);
                r.play();
            } catch (Exception e) {
                e.printStackTrace();
                UserPrefs.setLogerForException(Log.getStackTraceString(e).toString(),
                        GlobalContext.Myglobalcontext,ApiConstants.Excption_Log_Message);
            }
            CustomAlert alertDialog = new CustomAlert();
            alertDialog.setTitle(context.getResources().getString(R.string.notification_tite));
            alertDialog.setMessage(msg.obj.toString());
            alertDialog.setAlertId(Events.MORE_INFO);
            alertDialog.setTextGravity(Gravity.LEFT);
            ReplicaPrefs.showAlert(alertDialog);
        }
    };

    Message msgObj = handler.obtainMessage();
    msgObj.obj = message    ;
    handler.handleMessage(msgObj);
    }
    catch(Exception ex)
    {
        UserPrefs.setLogerForException(Log.getStackTraceString(ex).toString(),
                GlobalContext.Myglobalcontext,ApiConstants.Excption_Log_Message);
    }

}

一段时间后(不是确切的情况)我有以下错误:

java.lang.RuntimeException:每个线程只能在 android.os.Looper.prepare 创建一个 Looper

有谁知道我哪里出错了?

4

2 回答 2

0

我认为你应该看看这个来了解 lopper:Looper 的目的是什么以及如何使用它?

然后,看看这个:java.lang.RuntimeException:每个线程只能创建一个 Looper 来找到您问题的答案。

希望有帮助!

于 2015-12-14T08:12:50.397 回答
0

请注意:每个Handler都与一个捆绑在一起LooperLooper每个线程只能创建一个。所以,你可以Handler通过构造函数创建一个实例Handler(Looper)。用于Handler()创建一个实例时,默认Looper来自运行current的Main UI ThreadActivity

至于您上面的代码,您在 a 中定义showDialog(String message)Activity对吗?因此,这意味着将在Main UI Thread上调用此方法。因此,当您通过inside的构造函数创建Handler实例时,Main UI Thread将默认与实例捆绑在一起。这意味着是多余的,然后删除将解决您的问题。Handler()showDialog(String message)LooperHandlerLooper.prepare();Looper.prepare();

于 2015-12-14T09:04:13.077 回答