Answers:
Google的Android文档说:
异步任务由3个通用类型(称为Params,Progress和Result)以及4个步骤(称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute)定义。
AsyncTask的通用类型:
异步任务使用的三种类型如下:
Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.
并非所有类型都总是由异步任务使用。要将类型标记为未使用,只需使用Void类型:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
您可以进一步参考:http : //developer.android.com/reference/android/os/AsyncTask.html
或者您可以通过参考Sankar-Ganesh的博客来清除AsyncTask的作用
private class MyTask extends AsyncTask<X, Y, Z>
protected void onPreExecute(){
}
在启动新线程之前执行此方法。没有输入/输出值,因此只需初始化变量或您认为需要执行的任何操作即可。
protected Z doInBackground(X...x){
}
AsyncTask类中最重要的方法。您必须将所有您想在后台执行的工作放在这里,与主线程放在不同的线程中。在这里,我们有一个来自类型“ X”的对象数组作为输入值(您在标题中看到吗?我们有“ ... extends AsyncTask”这是输入参数的TYPES)并返回该类型的对象“ Z”。
protected void onProgressUpdate(Y y){
}
该方法使用publishProgress(y)方法调用,通常在想要在主屏幕上显示任何进度或信息时使用,例如进度条,用于显示您在后台执行的操作的进度。
protected void onPostExecute(Z z){
}
后台操作完成后调用此方法。作为输入参数,您将收到doInBackground方法的输出参数。
X,Y和Z类型呢?
从上面的结构可以推断出:
X – The type of the input variables value you want to set to the background process. This can be an array of objects.
Y – The type of the objects you are going to enter in the onProgressUpdate method.
Z – The type of the result from the operations you have done in the background process.
我们如何从外部类中调用此任务?只需以下两行:
MyTask myTask = new MyTask();
myTask.execute(x);
其中x是类型X的输入参数。
一旦我们运行了任务,我们就可以从“外部”找出其状态。使用“ getStatus()”方法。
myTask.getStatus();
我们可以收到以下状态:
RUNNING-表示任务正在运行。
待处理 -表示任务尚未执行。
FINISHED -表示onPostExecute(Z)已经完成。
有关使用AsyncTask的提示
不要手动调用onPreExecute,doInBackground和onPostExecute方法。这是系统自动完成的。
您不能在另一个AsyncTask或线程内调用AsyncTask。方法execute的调用必须在UI线程中完成。
方法onPostExecute在UI线程中执行(在这里您可以调用另一个AsyncTask!)。
任务的输入参数可以是一个对象数组,这样您就可以放置所需的任何对象和类型。
一个AsyncTask
在后台线程中运行的后台任务。它接受一个输入,执行进度并给出输出。
即
AsyncTask<Input,Progress,Output>
。
在我看来,当我们试图记住表格中的参数时,造成混乱的主要原因AsyncTask
。
关键是不要记住。
如果您可以可视化任务真正需要执行的操作,那么AsyncTask
用正确的签名编写便是小菜一碟。
只需弄清楚您的输入,进度和输出是什么,您就可以顺利进行了。
doInBackgound()
方法是最重要的方法,AsyncTask
因为
AsyncTask
参数而变化。所以让我们看一下关系
doInBackground()
和onPostExecute()
,onProgressUpdate()
也相关
向我显示代码
那么如何为DownloadTask编写代码?
DownloadTask extends AsyncTask<String,Integer,String>{
@Override
public void onPreExecute()
{}
@Override
public String doInbackGround(String... params)
{
// Download code
int downloadPerc = // calculate that
publish(downloadPerc);
return "Download Success";
}
@Override
public void onPostExecute(String result)
{
super.onPostExecute(result);
}
@Override
public void onProgressUpdate(Integer... params)
{
// show in spinner, access UI elements
}
}
您将如何运行此任务
new DownLoadTask().execute("Paradise.mp3");
// show in spinner, access UI elements
只是传下来最简单的解释了onProgressUpdate(...)
:)
请参考以下链接:
您不能传递三个以上的参数,如果只想传递1个参数,则对其他两个参数使用void。
1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
2. protected class InitTask extends AsyncTask<Context, Integer, Integer>
异步任务由在后台线程上运行的计算定义,并且其结果发布在UI线程上。异步任务由3个通用类型(称为Params,Progress和Result)以及4个步骤(称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute)定义。
KPBird