0

我想在线程尝试建立连接时显示此对话框,但是当我按下启动此方法的按钮时,该对话框不会显示。

public void add_mpd(View view) {
    dialog = ProgressDialog.show(MainActivity.this, "", "Trying to connect...");
    new Thread(new Runnable() {
        public void run() {
            try {
                String child;
                EditText new_mpd = (EditText) findViewById(R.id.new_mpd);
                child = new_mpd.getText().toString();
                mpd = new MPD(child);
                children.get(1).add(child);

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (MPDConnectionException e) {
                e.printStackTrace();
            }
        }
    }
    ).start();
    adapter.notifyDataSetChanged();
    dialog.dismiss();
}
4

2 回答 2

2

它不会显示,因为(阻塞)工作是在另一个线程中完成的。这意味着, -class 的start()-methodThread不会阻塞。

因此,您显示对话框,线程启动,对话框立即关闭(因此关闭)。

将调用放在-methoddismiss()的末尾,它应该可以正常工作。run()


以上可能对你有用,但你不应该Thread直接使用 -class 。它周围有包装纸,使用起来更舒适。

在 Android 中,如果您想在 UI-Thread 之外进行长期工作,您应该使用AsyncTask.

于 2012-08-28T19:09:30.183 回答
0

另外,为了建立卢卡斯所说的,你可以看看这个例子。

http://www.helloandroid.com/tutorials/using-threads-and-progressdialog

public class ProgressDialogExample extends Activity implements Runnable {

    private String pi_string;
    private TextView tv;
    private ProgressDialog pd;

    @Override
    public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.main);

            tv = (TextView) this.findViewById(R.id.main);
            tv.setText("Press any key to start calculation");
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

            pd = ProgressDialog.show(this, "Working..", "Calculating Pi", true,
                            false);

            Thread thread = new Thread(this);
            thread.start();

            return super.onKeyDown(keyCode, event);
    }

    public void run() {
            pi_string = Pi.computePi(800).toString();
            handler.sendEmptyMessage(0);
    }

    private Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                    pd.dismiss();
                    tv.setText(pi_string);

            }
    };

}

于 2012-08-28T19:11:39.340 回答