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()-method はThreadブロックされません。

したがって、ダイアログを表示すると、スレッドが開始され、ダイアログがすぐに閉じられます (したがって、閉じられます)。

dismiss()メソッドの最後に呼び出しを入れるrun()と、問題なく動作するはずです。


上記はうまくいくかもしれませんが、Thread-class を直接使用しないでください。その周りには、より快適に使用できるラッパーがあります。

Android では、UI スレッドから離れて長期的な作業を行いたい場合は、AsyncTask.

于 2012-08-28T19:09:30.183 に答える
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);

            }
    };

}

于 2012-08-28T19:11:39.340 に答える