- Asynchronous Android Programming(Second Edition)
- Helder Vasconcelos
- 398字
- 2021-07-14 10:43:15
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.
- WildFly:New Features
- Facebook Application Development with Graph API Cookbook
- Visual Basic程序開發(學習筆記)
- 數據結構習題精解(C語言實現+微課視頻)
- Mastering Apache Spark 2.x(Second Edition)
- 用戶體驗增長:數字化·智能化·綠色化
- 劍指MySQL:架構、調優與運維
- Building RESTful Python Web Services
- 領域驅動設計:軟件核心復雜性應對之道(修訂版)
- 硅谷Python工程師面試指南:數據結構、算法與系統設計
- Python語言實用教程
- Mastering C++ Multithreading
- Scala for Machine Learning(Second Edition)
- 大數據時代的企業升級之道(全3冊)
- Visual Basic程序設計實驗指導及考試指南