官术网_书友最值得收藏!

Providing indeterministic progress feedback

Having started what we know to be a potentially long-running task, we probably want to let the user know that something is happening. There are a lot of ways of doing this, but a common approach is to present a dialog displaying a relevant message.

A good place to present our dialog is from the onPreExecute() method of AsyncTask which executes on the main thread so it is allowed to interact with the user interface.

The modified DownloadImageTask will need a reference to a Context, so that it can prepare a ProgressDialog, which it will show and dismiss in onPreExecute() and onPostExecute() respectively. As doInBackground() has not changed, it is not shown in the following code, for brevity:

public class DownloadImageTask
  extends AsyncTask<URL, Integer, Bitmap> {
  ...
 private final WeakReference<Context> ctx;
 private ProgressDialog progress;
  ...
  public DownloadImageTask(Context ctx, ImageView imageView) {
    this.imageView = new WeakReference<ImageView>(imageView);
    this.ctx = new WeakReference<Context>(ctx);
  }

 @Override
 protected void onPreExecute() {
 if ( ctx !=null && ctx.get()!= null ) {
 progress = new ProgressDialog(ctx.get());
 progress.setTitle(R.string.downloading_image);
 progress.setIndeterminate(true);
 progress.setCancelable(false);
 progress.show();
 }
 }


  // ... doInBackground elided for brevity ...
  @Override
  protected void onPostExecute(Bitmap bitmap) {
    ...
 if ( progress != null ) { progress.dismiss(); }
 ...
  }
}

All that remains is to pass a Context to the constructor of our modified DownloadImageTask. As Activity is a subclass of Context, we can simply pass a reference to the host Activity:

showBut.setOnClickListener(new View.OnClickListener() {

  @Override
  public void onClick(View v) {
      ...
      // Pass in the Context and the image view to load
      // the image
      new DownloadImageTask(
        ShowMyPuppyActivity.this, iv).execute(url);
         ...   
  }
});

Figure 3.3 : Indeterministic Progress Dialog

Once the async task is started, the onPreExecute() callback will create an indeterministic progress dialog and display it as shown in Figure 3.3. The non-cancelable dialog will be placed over the UI screen in an opaque layer with the title defined. By indeterministic, we mean that beforehand, we can't estimate how much longer we have to wait for the task to complete.

Until the download finishes, and the dialog gets dismissed on onPostExecute(), the user is not able to interact with the application and the dialog will remain in the foreground.

Note

When any long computation is required before you are able to present your content in your application UI, you must present an indication that something is happening in the background while the user is waiting.

主站蜘蛛池模板: 巴彦淖尔市| 五华县| 沾益县| 肇东市| 靖宇县| 商河县| 三江| 和田市| 那坡县| 正阳县| 安远县| 铁力市| 大名县| 萨嘎县| 渝中区| 石狮市| 景泰县| 利津县| 康乐县| 峡江县| 边坝县| 琼结县| 都兰县| 舒城县| 弥勒县| 兴隆县| 闽侯县| 湘潭县| 尼木县| 安庆市| 安乡县| 栖霞市| 博兴县| 虞城县| 县级市| 襄樊市| 广南县| 海安县| 繁昌县| 东宁县| 镶黄旗|