的AsyncTask有4种重写方法onPreExecute(),doInBackground(),onProgressUpdate(),onPostExecute()
除了onProgressUpdate所有的都在工作.我应该怎么做才能使onProgressUpdate()起作用.任何人都可以简单地解释一下我的用途是onProgressUpdate()什么,应该在这里写些什么?
Sun*_*hoo 58
onProgressUpdate()用于通过此方法操作异步操作的进度.请注意具有数据类型的param Integer.这对应于类定义中的第二个参数.可以doInBackground()通过调用从方法体内触发此回调publishProgress().
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<Context, Integer, String> {
// -- 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
dug*_*ggu 21
这4个步骤
执行异步任务时,任务将执行4个步骤:
onPreExecute(),在执行任务之前在UI线程上调用.此步骤通常用于设置任务,例如通过在用户界面中显示进度条.
doInBackground(Params ...),在onPreExecute()完成执行后立即在后台线程上调用.此步骤用于执行可能需要很长时间的后台计算.异步任务的参数将传递给此步骤.计算结果必须由此步骤返回,并将传递回最后一步.此步骤还可以使用publishProgress(Progress ...)发布一个或多个进度单元.这些值发布在UI线程的onProgressUpdate(Progress ...)步骤中.
onProgressUpdate(Progress ...),在调用publishProgress(Progress ...)后在UI线程上调用.执行的时间是不确定的.此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度.例如,它可用于为进度条设置动画或在文本字段中显示日志.
onPostExecute(Result),在后台计算完成后在UI线程上调用.背景计算的结果作为参数传递给该步骤.
例
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
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));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
Run Code Online (Sandbox Code Playgroud)
AsyncTask的泛型类型 异步任务使用的三种类型如下:
Params,执行时发送给任务的参数类型.
进度,后台计算期间发布的进度单元的类型.
结果,后台计算结果的类型.
是的,你是对的,有四种方法 AsyncTask
执行异步任务时,任务将执行4个步骤:
onPreExecute()
Run Code Online (Sandbox Code Playgroud)
在执行任务后立即在UI线程上调用.此步骤通常用于设置任务,例如通过在用户界面中显示进度条.
doInBackground(Params...)
Run Code Online (Sandbox Code Playgroud)
完成执行后立即在后台线程上调用onPreExecute().此步骤用于执行可能需要很长时间的后台计算.异步任务的参数将传递给此步骤.计算结果必须由此步骤返回,并将传递回最后一步.此步骤还可用于publishProgress(Progress...)发布一个或多个进度单位.这些值将在onProgressUpdate(Progress...)步骤中的UI线程上发布.
onProgressUpdate(Progress...)
Run Code Online (Sandbox Code Playgroud)
调用后在UI线程上调用publishProgress(Progress...).执行的时间是不确定的.此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度.例如,它可用于为进度条设置动画或在文本字段中显示日志.
onPostExecute(Result)
Run Code Online (Sandbox Code Playgroud)
在后台计算完成后在UI线程上调用.背景计算的结果作为参数传递给该步骤.
如需更多信息,请点击此处
| 归档时间: |
|
| 查看次数: |
83524 次 |
| 最近记录: |