gpt4 book ai didi

android - 有人可以解释如何在 Android 中使用 ASyncTask 吗?

转载 作者:行者123 更新时间:2023-11-29 14:22:59 25 4
gpt4 key购买 nike

我一直在做大量研究并查看 Android 中 ASyncTask 的文档,但我似乎无法理解它。我只是想在 fragment 在应用程序中可见时运行一些方法,但为了更轻松地做到这一点,我认为我应该使用 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()
{

}
}

现在我的问题如下:

  1. 在尖括号中,我有 Void、Void、Void。这些到底代表什么,我怎么知道放在那里是正确的?

  2. 对于类中的每个方法,我都将每个方法称为 void。它们什么时候应该不同于 void(例如 boolean、String、long 等)?

  3. 对于 doInBackground 方法,我在括号中有 Void... 空白。我究竟应该放在那里什么?它们代表什么?

感谢您的帮助。对于像我这样的初学者来说,这方面的文档不是很清楚。

最佳答案

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);
...
}

没有名为 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);
...
}

假设我正在定义一个 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();
}
}

我会按如下方式启动:

String[] urls = ...
MyAsyncTask task = new MyAsyncTask();
task.execute(urls);

传递给 execute 的参数将传递给 doInBackground。无论您在 doInBackground 中做什么,您都需要返回作为参数传递给 onPostExecute 的内容。在 doInBackground 中,您可以调用 publishProgress,在这里您可以像我一样做一些事情(但您不必这样做)。

关于android - 有人可以解释如何在 Android 中使用 ASyncTask 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22433509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com