Android Can';t在未调用Looper.prepare()的线程内创建处理程序(在处理程序()内)
我正在从后台线程调用处理程序类。在Handler类中,我试图显示一个toast。从理论上讲,它应该能够完美地工作,因为Handler是将UI任务转发到主UI线程的队列。然而,在我的情况下,我得到了例外Android Can';t在未调用Looper.prepare()的线程内创建处理程序(在处理程序()内),android,multithreading,handler,Android,Multithreading,Handler,我正在从后台线程调用处理程序类。在Handler类中,我试图显示一个toast。从理论上讲,它应该能够完美地工作,因为Handler是将UI任务转发到主UI线程的队列。然而,在我的情况下,我得到了例外 private void firstTimeLogin() { final LoginUiThreadHandler loginHandler = new LoginUiThreadHandler(); new Thread(new Runnable() {
private void firstTimeLogin() {
final LoginUiThreadHandler loginHandler = new LoginUiThreadHandler();
new Thread(new Runnable() {
@Override
public void run() {
Message m = loginHandler.obtainMessage();
Bundle bund = new Bundle();
bund.putInt("loginResult", 1);
m.setData(bund);
loginHandler.handleMessage(m);
}
}).start();
}
private class LoginUiThreadHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
int loginResult = msg.getData().getInt("loginResult");
if(loginResult == 0)
Toast.makeText(getActivity().getApplicationContext(), "Login success", Toast.LENGTH_SHORT).show();
}
}
我做错了什么?替换为-
LoginUiThreadHandler loginHandler=新的LoginUiThreadHandler(Looper.getMainLooper())代码>
而不是-
LoginUiThreadHandler loginHandler=新的LoginUiThreadHandler()
final LoginUiThreadHandler loginHandler=new LoginUiThreadHandler(getMainLooper())。如果要发送消息
调用sendMessage(m)
,而不是handleMessage(m)
,也不要只对一个int使用设置数据
,请参阅所有获取消息
方法,您需要使用参数Looper在LoginUiThreadHandler中创建构造函数,并作为-LoginUiThreadHandler(Looper l){super(l);}传递给super(Looper)