我有一个具有不同活动的Android应用程序,它们都从Web源提取数据。这是通过实现Runnable并使用activity作为对象创建一个线程来完成的。基本类看起来像这样:
public ActivityX extends Activity implements Runnable {
@Override
public onResume() {
super.onResume();
Thread someThread = new Thread(this);
someThread.start();
}
@Override
public run() {
try {
// pull web content
}
catch(TimeOutException e) {
// >>> create dialog here <<<
// go back to another activity
}
}
}
我尝试使用静态方法创建一个对话框助手类,该方法返回超时对话框,然后像这样调用show():
HelperClass.getTimeOutDialog().show();
但问题是,我无法从run()方法中调用它,因为它位于不同的线程中。如果我尝试,我将得到一个运行时异常说明:
无法在未调用Looper.prepare()的线程内创建处理程序
我需要为几十个活动执行此对话框,我真的想要使用Handler对象并每次都发送消息来调用对话框。有没有更简单的方法来做到这一点?不幸的是,我现在想不出任何东西。
我的代码看起来像这样:
handler.handleEmptyMessage(1);
这是为了调用处理程序。以下将处理该消息:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == 1) {
// show dialog here
}
}
};
干杯
答案 0 :(得分:1)
@Override
public run() {
try {
// pull web content
}
catch(TimeOutException e) {
runOnUiThread(new Runnable(){
@Override
public void run() {
// >>> create dialog here <<<
// go back to another activity
}
}
}
}
如果您不想使用Handler,请尝试上面的那个。
答案 1 :(得分:0)
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what == 1) {
// show dialog here
}
}
};
此代码是您活动的一部分而不是线程吗?如果它是非Ui线程的一部分,它会给你错误信息。确保在UI线程中创建了处理程序实例,因为处理程序包含对它们创建的线程的隐式引用。