我创建了从AlertDialog继承的类。此类启动线程,通过Internet检查某些值(长操作时间)。该对话框有单个按钮(POSITIVE_BUTTON)。应该禁用此按钮,直到线程结束。但我不知道如何从线程启用此按钮。
我的代码:
public MyDialog(Context context) {
super(context);
View view = getLayoutInflater().inflate(R.layout.dialog, null);
setView(view);
getButton(BUTTON_POSITIVE).setEnabled(false);
new Thread(new Runnable() {
public void run() {
// Long operation time code
getButton(BUTTON_POSITIVE).setEnabled(true); // CRASH!!!
}
}).start();
}
错误说我从另一个线程更改了视图。我无法使用runOnUIThread
方法,因为它不会在AlertDialog中退出。
我该怎么办?
答案 0 :(得分:1)
如果您能够在构造函数中传递Activity
,只需执行:
public class MyDialog extends AlertDialog {
public MyDialog(Activity act) {
super(act);
View view = getLayoutInflater().inflate(R.layout.layout_launch, null);
setView(view);
getButton(BUTTON_POSITIVE).setEnabled(false);
act.runOnUiThread(new Runnable() {
public void run() {
// Long operation time
getButton(BUTTON_POSITIVE).setEnabled(true); // CRASH!!!
}
});
}
}
答案 1 :(得分:0)
您无法管理与UI线程不同的线程中的UI元素
public MyDialog(Context context) {
super(context);
final View view = getLayoutInflater().inflate(R.layout.dialog, null);
setView(view);
getButton(BUTTON_POSITIVE).setEnabled(false);
new Thread(new Runnable() {
public void run() {
// Long operation time code
view.post(new Runnable() {
public void run() {
View button = getButton(BUTTON_POSITIVE);
if (button != null)
button.setEnabled(true); // CRASH!!!
}
}
}
}).start();
}
您还要检查getButton()
答案 2 :(得分:-1)
假设你传递的上下文是调用活动,那么:
public MyDialog(Context context) {
super(context);
View view = getLayoutInflater().inflate(R.layout.activity_main, null);
setView(view);
getButton(BUTTON_POSITIVE).setEnabled(false);
((Activity) context).runOnUiThread(
new Thread(new Runnable() {
public void run() {
// Long operation time
getButton(BUTTON_POSITIVE).setEnabled(true); // CRASH!!!
}
}));
}