有人可以解释如何在Android上使用ASyncTask吗?

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)

现在我的问题如下:

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

  2. 对于类中的每个方法,我将每个方法称为void.它们何时应该与void不同(如boolean,String,long等)?

  3. 对于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,在那里你可以像我一样做(但你不必).