Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为不同的进程运行相同的AsyncTask类?_Java_Android_Android Asynctask - Fatal编程技术网

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

Java 如何为不同的进程运行相同的AsyncTask类?,java,android,android-asynctask,Java,Android,Android Asynctask,我正在尝试构建一个带有两个按钮的演示应用程序,一个下载视频,另一个下载PDF。我想通过AsyncTask在后台线程中进行下载。到目前为止,我已经有了带有实现方法的启动程序代码。我还没有为我想下载的内容添加代码,因为我想弄清楚单独下载背后的逻辑,所以现在我有日志消息 代码如下: public class MainActivity extends AppCompatActivity { Button downloadVideo, downloadPDF; DownloadingCla

我正在尝试构建一个带有两个按钮的演示应用程序,一个下载视频,另一个下载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;
        }
    }
}
public类MainActivity扩展了AppCompatActivity{
按钮下载视频,下载PDF;
DownloadingClass DownloadingClass=新的DownloadingClass();
私有静态最终字符串TAG=“omar.asynctaskdemo;”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
downloadVideo=findviewbyd(R.id.download\u video);
downloadPDF=findviewbyd(R.id.download\u pdf);
downloadVideo.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){}
});
下载pdf.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){}
});
}
私有类下载类扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
Log.d(标签“doInBackground:Before”);
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
Log.d(标签“doInBackground:After”);
}
@凌驾
受保护的void onProgressUpdate(void…值){
super.onProgressUpdate(值);
Log.d(标签“doInBackground:Progress”);
}
@凌驾
受保护的空位背景(空位…空位){
d(标签“doInBackground:要下载的内容”);
返回null;
}
}
}

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

DownloadingClass downloadPDF = new DownloadingClass();
DownloadingClass downloadVideo = new DownloadingClass();
然后只需调用
downloadPDF.execute()/
下载视频。执行()

或者您可以通过执行器服务来管理它们:

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

DownloadingClass downloadPDF = new DownloadingClass();
DownloadingClass downloadVideo = new DownloadingClass();
然后只需调用
downloadPDF.execute()/
下载视频。执行()

或者您可以通过执行器服务来管理它们: 不要这样做

DownloadingClass downloadingClass = new DownloadingClass();
始终在任务开始前创建:

new DownloadingClass().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
这是因为您不能重用AsyncTask。它具有状态,一旦状态为“完成”,它将不会再次运行。

不要这样做

DownloadingClass downloadingClass = new DownloadingClass();
始终在任务开始前创建:

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

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

是,但我将为视频和PDF使用不同的下载链接,因此API调用将不同。是,但我将为视频和PDF使用不同的下载链接,因此API调用将不同。我已接受您的回答。如果你认为这是一个被问得很好的问题,你能给我一张赞成票吗?我已经接受了你的答案。如果你认为这是一个问得很好的问题,你能给我一票吗?