В каждом потоке может быть создан только один Looper.

Со следующим кодом:

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: только один Looper может быть создан для каждого потока на android.os.Looper.prepare.

Кто-нибудь знает, где я ошибся?


person IGT    schedule 14.12.2015    source источник


Ответы (2)


Я думаю, что вам следует взглянуть на это, чтобы понять о сучкорезе: -use-it">Какова цель Looper и как его использовать?

Затем взгляните на это: java. lang.RuntimeException: В каждом потоке может быть создан только один Looper для поиска ответа на ваш вопрос.

Надеюсь на помощь!

person Lạng Hoàng    schedule 14.12.2015

Обратите внимание: каждый Handler связан с одним Looper, из которых только один Looper может быть создан для каждого потока. Итак, вы можете создать экземпляр Handler с помощью конструктора Handler(Looper). При использовании Handler() для создания одного экземпляра Looper по умолчанию берется из основного потока пользовательского интерфейса, в котором выполняются текущие Activity.

Что касается ваших кодов выше, вы определили showDialog(String message) в Activity, верно? Таким образом, это означает, что этот метод будет вызываться в основном потоке пользовательского интерфейса. Следовательно, когда вы создаете экземпляр Handler с помощью конструктора Handler() внутри showDialog(String message), Looper из основного потока пользовательского интерфейса будет по умолчанию связан с экземпляром Handler. Это означает, что Looper.prepare(); является избыточным, и тогда удаление Looper.prepare(); решит вашу проблему.

person SilentKnight    schedule 14.12.2015
comment
Не совсем. Handler() использует текущий поток и генерирует исключение, если текущий поток не является Looper. Это обычно, но не обязательно основной поток. - person Kevin Krumwiede; 15.12.2015
comment
Да, Handler() будет связан с Looper, созданным Thread, на котором запускается showDialog(String message). В этом случае showDialog(String message) выполняется в основном потоке пользовательского интерфейса. - person SilentKnight; 15.12.2015