2

この場合、スレッドをどのように使用すればよいかを理解したいですか? テキストビューを含むダイアログが表示されます。textview は、完了までに約 1 秒かかるメソッドから情報を受け取ります。しかし、ダイアログをすぐに表示し、データをスレッドにロードしたいので、その特定のデータを 1 秒後にダイアログに表示したい (現在 1 秒間画面に表示されている)。

だから私はGetData()データ(文字列)を返すメソッドを持っています。ボタンをクリックした後に表示されるダイアログがあります。

Button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {

    final Dialog dialog = new Dialog(getActivity());
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    TextView tv= (TextView) dialog.findViewById(R.id.tv1);
    tv.setText(GetData());    
    dialog.show;
    }
}

どうすればできますか?前もって感謝します!

わかりました、Asynctask ですが、内部のテキストビューにどのように触れることができますか?

//AsyncTask

    public class DefaultAsyncTask extends
    AsyncTask<Void, Integer, Void> {

        int myProgress;

        @Override
        protected void onPostExecute(Void result) {

        }

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub

        }

        @Override
        protected Void doInBackground(Void... params) {

            return null;
        }


 }
4

3 に答える 3

3

のイベントAsyncTaskにアタッチして、時間のかかるコードをまとめます。Dialog

タスク:

public class MyTask extends AsyncTask<Void,Void,String>{
    @Override
    protected String doInBackground(Void... voids) {
        //-- put get data code here --
        //-- if this takes too much time, repeatedly check "isCancelled()", and exit if its true--
        return "the string result";
    }
}

使用法:

public void ShowDialog(Context c){
    Dialog d = new Dialog(c);
    final TextView t = new TextView(c);
    d.setContentView(t);

    //--setup the task to update text--
    final MyTask w = new MyTask(){
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            t.setText(s);
        }
    };

    //--setup the dialog to run task when shown--
    d.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialogInterface) {
            w.execute();
        }
    });

    //--setup the dialog to kill task if its dismissed--
    d.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialogInterface) {
            w.cancel(true);
        }
    });


    //-- show the dialog--
    d.show();
}

上記のコードは単なる例です。エレガントな方法は、Dialogクラスを拡張し、このコードをそこに配置してTaskRunnerDialog.

于 2013-04-14T12:20:14.833 に答える