在AsyncTask期间更新UI

时间:2014-08-07 12:11:22

标签: android multithreading android-asynctask ui-thread

如何在任务完成之前编辑AsyncTask中的活动视图?我无法从doInBackground方法访问任何视图,我不想等到任务完成。有办法去做吗?或者我是否必须在doInBackground中创建一个线程(听起来对我来说是不好的做法),然后访问该线程的完成视图?

4 个答案:

答案 0 :(得分:1)

覆盖此方法:

protected void onProgressUpdate(Integer... progress) {
    setProgressPercent(progress[0]);
}

在AsyncTask的doInBackground()中调用它。此方法publishProgress(Progress... values)

当您从doInBackground()调用它时,

会在UI线程上发生。

有关详情,请参阅AsyncTask

答案 1 :(得分:1)

您需要在AsyncTask类中重写此方法:

  @Override
            protected void onProgressUpdate(Void... values) {
                // TODO Auto-generated method stub
                ProgressBar bar = (ProgressBar) findViewById(R.id.prgLoading); 
                bar.setIndeterminate(true);
                super.onProgressUpdate(values);
            }

您可以在此处显示进度条,并在其中设置一些值。

答案 2 :(得分:1)

您可以定义包含以下内容的类MyAsyncTask

private final ProgressDialog progressDialog;

public MyAsyncTask(Context context) {
    super(context);

    progressDialog = new ProgressDialog(context);
    progressDialog.setTitle(R.string.title);
    progressDialog.setButton(
        DialogInterface.BUTTON_NEGATIVE,
        context.getResources().getString(R.string.abort), 
        new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                MyAsyncTask.this.cancel(true);
                progressDialog.dismiss();
            }
        }
    ); 
    progressDialog.show();
}

@Override
protected void onProgressUpdate(String... params) {
    progressDialog.setMessage(params[0]);
}

然后,您可以使用ProgressDialog向GUI报告,例如,通过调用publishProgress("TEST")

答案 3 :(得分:1)

您可以从onProgressUpdate()更新用户界面。有一种棘手的方法,您可以发送一些整数或布尔值来进行更新并根据条件更改您的UI。

@Override
        protected void onProgressUpdate(Integer... values) {
            if(values[0] == 1) {
          //    update the UI
                button.settext("updating");
            }
        }

您可以通过调用

调用onProgressUpdate fram asynctask
publishProgress(1);

希望这有效,试试。