В каждом потоке может быть создан только один 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

У кого-нибудь есть идеи, где я ошибся?

2 ответа

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

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

Надеюсь, что это поможет!

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

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

Другие вопросы по тегам