"android如何使用异步任务和进度条"
"android如何使用异步任务和进度条"
Asynctask有4个重写方法onPreExecute()
、doInBackground()
、onProgressUpdate()
、onPostExecute()
,除了onProgressUpdate()
之外其它都可以正常工作。
我该怎么做才能让onProgressUpdate()
正常工作?
有人能否简要地向我解释一下onProgressUpdate()
的用途,我应该在其中写什么?
admin 更改状态以发布 2023年5月21日
onProgressUpdate 在调用publishProgress 后在UI线程上运行。从AsyncTask文档中可以看到,你的代码应该像这样:
private class DownloadFilesTask extends AsyncTask{ protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
onProgressUpdate()
方法用于通过此方法操作异步操作的进度。请注意,参数的数据类型为 Integer
。这对应于类定义中的第二个参数。该回调可以通过调用 publishProgress()
在 doInBackground()
方法体内触发。
例子
import android.app.Activity; import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class AsyncTaskExample extends Activity { protected TextView _percentField; protected Button _cancelButton; protected InitTask _initTask; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); _percentField = (TextView) findViewById(R.id.percent_field); _cancelButton = (Button) findViewById(R.id.cancel_button); _cancelButton.setOnClickListener(new CancelButtonListener()); _initTask = new InitTask(); _initTask.execute(this); } protected class CancelButtonListener implements View.OnClickListener { public void onClick(View v) { _initTask.cancel(true); } } /** * sub-class of AsyncTask */ protected class InitTask extends AsyncTask{ // -- run intensive processes here // -- notice that the datatype of the first param in the class definition matches the param passed to this // method // -- and that the datatype of the last param in the class definition matches the return type of this method @Override protected String doInBackground(Context... params) { // -- on every iteration // -- runs a while loop that causes the thread to sleep for 50 milliseconds // -- publishes the progress - calls the onProgressUpdate handler defined below // -- and increments the counter variable i by one int i = 0; while (i <= 50) { try { Thread.sleep(50); publishProgress(i); i++; } catch (Exception e) { Log.i("makemachine", e.getMessage()); } } return "COMPLETE!"; } // -- gets called just before thread begins @Override protected void onPreExecute() { Log.i("makemachine", "onPreExecute()"); super.onPreExecute(); } // -- called from the publish progress // -- notice that the datatype of the second param gets passed to this method @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Log.i("makemachine", "onProgressUpdate(): " + String.valueOf(values[0])); _percentField.setText((values[0] * 2) + "%"); _percentField.setTextSize(values[0]); } // -- called if the cancel button is pressed @Override protected void onCancelled() { super.onCancelled(); Log.i("makemachine", "onCancelled()"); _percentField.setText("Cancelled!"); _percentField.setTextColor(0xFFFF0000); } // -- called as soon as doInBackground method completes // -- notice that the third param gets passed to this method @Override protected void onPostExecute(String result) { super.onPostExecute(result); Log.i("makemachine", "onPostExecute(): " + result); _percentField.setText(result); _percentField.setTextColor(0xFF69adea); _cancelButton.setVisibility(View.INVISIBLE); } } }