Progressdialog不会出现

时间:2012-08-28 19:05:17

标签: android dialog progressdialog

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

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();
    }
}

2 个答案:

答案 0 :(得分:2)

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

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

dismiss() - 方法结束时拨打run(),这应该可以正常工作。


上述内容可能对您有用,但您不应直接使用Thread - 类。周围有包装,使用起来更舒服。

在Android中,如果你想在UI-Thread上做长期工作,你应该使用AsyncTask

答案 1 :(得分:0)

另外,为了建立Lukas所说的,你可以看一下这个例子。

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);

            }
    };

}