如何为不同的进程运行相同的AsyncTask类?

时间:2018-10-23 02:45:36

标签: java android android-asynctask

我正在尝试用2个按钮构建一个演示应用程序,一个下载视频,另一个下载PDF。我想处理通过AsyncTask在后​​台线程中进行的下载。到目前为止,我已经有了带有实现方法的入门代码。我还没有添加要下载内容的代码,因为我想弄清楚单独下载背后的逻辑,因此,到目前为止,我有日志消息。

这是代码:

public class MainActivity extends AppCompatActivity {
    Button downloadVideo, downloadPDF;
    DownloadingClass downloadingClass = new DownloadingClass();
    private static final String TAG = "omar.asynctaskdemo;";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        downloadVideo = findViewById(R.id.download_video);
        downloadPDF = findViewById(R.id.download_pdf);

        downloadVideo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {}
        });

        downloadPDF.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {}
        });
    }

    private class DownloadingClass extends AsyncTask<Void, Void, Void>{
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.d(TAG, "doInBackground: Before");
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            Log.d(TAG, "doInBackground: After");
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
            Log.d(TAG, "doInBackground: Progress");
        }

        @Override
        protected Void doInBackground(Void... voids) {
            Log.d(TAG, "doInBackground: Content to download");
            return null;
        }
    }
}

我希望能有一个简洁的解释。

2 个答案:

答案 0 :(得分:2)

不要这样做

DownloadingClass downloadingClass = new DownloadingClass();

总是在任务开始前创建:

new DownloadingClass().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

这是因为您不能重复使用AsyncTask。它具有状态,状态为“完成”后将不再运行。

答案 1 :(得分:1)

如果两种下载方法都具有相同的输入/输出类型,则可以通过为每种方法声明一个对象来使用相同的T,例如:

DownloadingClass

然后只需调用DownloadingClass downloadPDF = new DownloadingClass(); DownloadingClass downloadVideo = new DownloadingClass(); / downloadPDF.execute();

或者您可以通过downloadVideo.execute();来管理它们: How to wait for all threads to finish, using ExecutorService?