AlertDialog上的线程

时间:2013-06-14 16:34:25

标签: android multithreading dialog

我创建了从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中退出。 我该怎么办?

3 个答案:

答案 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!!!
        }
    }));
}