Pat*_*ion 1 android asynchronous android-asynctask
我一直在做一堆研究并查看Android中ASyncTask的文档,但我似乎无法绕过它.我只是想在一个片段在应用程序中可见时运行一些方法,但为了更容易做到这一点,我想我应该使用ASyncTask.我的示例代码如下:
private class syncExample extends ASyncTask <Void, Void, Void>
{
@Override
protected void onPreExecute()
{
}
@Override
protected void doInBackground(Void... voids)
{
}
@Override
protected void onProgressUpdate()
{
}
@Override
protected void onPostExecute()
{
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题如下:
在尖括号中,我有Void,Void,Void.这些代表到底是什么,我怎么知道在那里放置什么是正确的?
对于类中的每个方法,我将每个方法称为void.它们何时应该与void不同(如boolean,String,long等)?
对于doInBackground方法,我在括号中有Void ...空格.我究竟应该把它放在那里?它们代表什么?
谢谢您的帮助.关于这个的文档对于像我这样的初学者来说并不是很清楚.
Kar*_*uri 11
AsyncTask使用参数化类型(java泛型),以便您可以指定在定义自己的AsyncTask时使用的类型.也许以这种形式解释更容易:
public abstract class AsyncTask<Params, Progress, Result> {
...
protected abstract Result doInBackground(Params... params);
protected abstract void onProgressUpdate(Progress... progress);
protected abstract void onPostExecute(Result result);
...
}
Run Code Online (Sandbox Code Playgroud)
没有名为Params,Progress或Result的类.这些是泛型类型.它们只是您在定义自己的AsyncTask子类时要使用的类型的占位符.以上同样可以这样写:
public abstract class AsyncTask<A, B, C> {
...
protected abstract C doInBackground(A... params);
protected abstract void onProgressUpdate(B... progress);
protected abstract void onPostExecute(C result);
...
}
Run Code Online (Sandbox Code Playgroud)
假设我正在定义一个AsyncTask,它接受一个表示URL的字符串列表,它会ping每个字符串以查看它是否可访问,然后返回可到达的数字.同时,每次测试都会ProgressBar在每次测试完成后更新.它可能看起来像这样:
public class MyAsyncTask extends AsyncTask<String, Integer, Integer> {
@Override
protected Integer doInBackground(String... params) {
int total = params.length;
int successfulPings = 0;
for (int i = 0; i < total; i++) {
if (isReachable(params[i])) {
successfulPings++;
}
publishProgress(i, total);
}
return successfulPings;
}
@Override
protected void onProgressUpdate(Integer... progress) {
int testsSoFar = progress[0];
int totalTests = progress[1];
progressBar.setMax(totalTests);
progressBar.setProgress(testSoFar);
}
@Override
protected void onPostExecute(Integer result) {
Toast.makeTest(context, "Reached " + result + " sites.", Toast.LENGTH_SHORT).show();
}
}
Run Code Online (Sandbox Code Playgroud)
我会发起如下:
String[] urls = ...
MyAsyncTask task = new MyAsyncTask();
task.execute(urls);
Run Code Online (Sandbox Code Playgroud)
传入的论点execute将被传入doInBackground.无论你做什么doInBackground,你都需要返回一些作为参数传入的东西onPostExecute.在里面doInBackground,你可以打电话publishProgress,在那里你可以像我一样做(但你不必).
| 归档时间: |
|
| 查看次数: |
1897 次 |
| 最近记录: |