В каждом потоке может быть создан только один 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();
решит вашу проблему.