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 回答
0

使用异步任务

希望这会有所帮助,亚龙

于 2013-04-14T12:09:05.337 回答
-1

普通线程不会运行任何 ui 组件,使用此 uithread 会产生错误

runOnUiThread(new Runnable() {
                 public void run() {

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;

                }
            });
于 2013-04-14T12:04:03.290 回答