Android 如何实现AsyncTask模式以避免代码过于冗长

Android 如何实现AsyncTask模式以避免代码过于冗长,android,android-asynctask,Android,Android Asynctask,我正在实现一个应用程序,它使用许多方法,需要一个带有等待对话框的AsyncTask。 实际上,我的方法是每次使用一个扩展AsyncTask的内部类 差不多 private class AsyncOperation extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute(){ pDialog = new ProgressDialog

我正在实现一个应用程序,它使用许多方法,需要一个带有等待对话框的
AsyncTask
。 实际上,我的方法是每次使用一个扩展AsyncTask的内部类

差不多

 private class AsyncOperation extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute(){
            pDialog = new ProgressDialog(CurrencyConverterActivity.this);
            pDialog.setMessage("Waiting...");
            pDialog.show();
        }
        @Override
        protected Void doInBackground(Void... params) {
           ...
          return null
         }

        protected void onPostExecute(Void params){
            pDialog.dismiss();
            runOnUiThread(new Runnable() {
                public void run() {
                    //dialogs according status the                     
                    //int status is a static variable declared in external class
                }

            });


        }
私有类AsyncOperation扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
pDialog=新建进度对话框(CurrencyConverterActivity.this);
pDialog.setMessage(“等待…”);
pDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…参数){
...
返回空
}
受保护的void onPostExecute(void参数){
pDialog.disclose();
runOnUiThread(新的Runnable(){
公开募捐{
//根据状态的对话框
//int status是在外部类中声明的静态变量
}
});
}
由于使用这种方法,我必须多次编写这个内部类,这会导致脏代码无法很好地读取,因此我正在寻找一种更智能的解决方案


有人能帮我吗?

你可以在一个单独的文件中创建一个
AsyncTask
(不是作为一个内部类)并多次重用它。
AsyncTask
不一定是一个内部类

如果需要,您可能需要修改
AsyncTask
以获取其他参数,使其可重用

您还可以为
AsyncTask
创建一个构造函数,其中包含需要传递给它的值的参数,并使用该构造函数实例化
AsyncTask


如果您在不同位置使用AsyncTasks的方式相同或至少相似,这种方法是有意义的。如果您在每个AsyncTask中使用完全不同的代码,则最好使用单独的AsyncTasks(尽管您仍然可以将它们从内部类提取到单独的类中).

每次使用异步任务时是否调用同一网络? 如果是,那么您可以有一个类来扩展异步并传递每个调用的值

大概是这样的:

MainActivity:
First method:
AsyncOperation asyncCall = new AsyncOperation(MainActivity.this, "abc", "bcd");
asyncCall.execute();

Second method:
AsyncOperation asyncCall = new AsyncOperation(MainActivity.this, "aaa", "bbb");
asyncCall.execute();

callback(…){

}


Async Class:
 private class AsyncOperation extends AsyncTask<Void, Void, Void> {

      AsyncOperation(listener, string, string)
{

}

        @Override
        protected void onPreExecute(){
            pDialog = new ProgressDialog(CurrencyConverterActivity.this);
            pDialog.setMessage("Waiting...");
            pDialog.show();
        }
        @Override
        protected Void doInBackground(Void... params) {
           ...
          return null
         }

        protected void onPostExecute(Void params){
            pDialog.dismiss();
            listener.callback(…);


        }
main活动:
第一种方法:
AsyncOperation asyncCall=新的AsyncOperation(MainActivity.this,“abc”,“bcd”);
asyncCall.execute();
第二种方法:
AsyncOperation asyncCall=新的AsyncOperation(MainActivity.this,“aaa”,“bbb”);
asyncCall.execute();
回调(…){
}
异步类:
私有类AsyncOperation扩展了AsyncTask{
异步操作(侦听器、字符串、字符串)
{
}
@凌驾
受保护的void onPreExecute(){
pDialog=新建进度对话框(CurrencyConverterActivity.this);
pDialog.setMessage(“等待…”);
pDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…参数){
...
返回空
}
受保护的void onPostExecute(void参数){
pDialog.disclose();
回调函数(…);
}

但这样一来,对于需要AsyncTask的每个方法,变量都不同,我遇到了问题……您能给我提供更多详细信息吗?@AndreaF我更新了我的答案-创建一个新的构造函数并以这种方式传递所有必要的值。但我如何获得各种结果?例如,一个方法返回一个ArrayList另一个方法返回一个布尔值等。如果我使用异步任务类作为内部类,我可以通过使用静态参数来解决这个问题,但如果使用这种方法,我不知道如何获得结果。如果返回不同的类型,我认为你真的无法绕开它。在这种情况下,这些是真正不同的异步任务,它们应该有单独的类es(内部或非内部)。但也只有一种类型如何才能得到结果?如果有一种方法,我应该根据情况每次强制转换对象。您是否使用androidhive中的代码?这很糟糕(很多糟糕的代码练习)…您不需要从onPostExecute调用runOnUiThread…您还可以在AsyncTask中删除对话框(我认为使用对话框是很糟糕的UI模式)…只需在视图中使用一些不确定的进度条我们需要更多关于每个异步任务工作所需内容的信息。所有内容都是int、string等或自定义对象?@selvin我不知道这个网站。我使用该对话框以防出现问题或提醒用户。不过,该代码只是一个通用示例,用于给出一般性的想法@mario在我的应用程序中,至少有200个方法需要异步任务,因此我需要通用方法来用于每次方法调用,而无需多次重写相同的代码。