如何在Android中使AsyncTask模块化

时间:2014-05-08 06:34:10

标签: android

我对Android开发很新。我正在一个应用程序中工作,我需要对api进行大量的异步调用。对于每个API调用,我必须一遍又一遍地编写类似的AsyncTask类。那么,有没有办法使这些异步调用模块化?

3 个答案:

答案 0 :(得分:8)

是的,可以使用Listener和AsyncTask和参数化构造函数

检查

创建界面

public interface OnTaskCompletListerner {
 void oncompleteListerner(String name);
}

创建一个AsyncTask类,如下所示

public class AsyncTaskModuler  extends AsyncTask<Void, Void, String> {

    private Context context;
    private HashMap<String, String> data;
    private String URL;
    private OnTaskCompletListerner taskdone;

    public AsyncTaskModuler(Context ctx,HashMap<String, String> data,String url,OnTaskCompletListerner taskdone){

        this.context=ctx;
        this.data=data;
        this.URL=url;
        this.taskdone=taskdone;
    }

    @Override
    protected String doInBackground(Void... params) {
        //Do the task here and return the value if needed 
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        taskdone.oncompleteListerner(result);
    }

并在您的活动中将其称为

public class CallAync extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String url="";
        HashMap<String, String> data=new HashMap<String, String>();
        AsyncTaskModuler moduler=new AsyncTaskModuler(CallAync.this, data, url, completListerner);
        moduler.execute();
    }

    OnTaskCompletListerner completListerner=new OnTaskCompletListerner() {

        @Override
        public void oncompleteListerner(String name) {

        }
    };
}

答案 1 :(得分:1)

创建一般异步任务并将您的网址作为参数传递给它。为此,您可以为所有api调用重复使用相同的异步任务

public class myTask extends AsyncTask<Void, Void, Void> {

    String muUrl;   


    public myTask(Context context, Activity activity,
            String url) {
        contxt = context;
        myUrl=url;
    }

    @Override
    protected Void doInBackground(Void... params) {

        makeApiCalls();

        return null;
    }
}

按以下方式启动任务:

new myTask(this, this, urlStr).execute();

修改

  

如何在PostExecute()上执行不同的逻辑?

您可以在myTask的构造函数中添加另一个param。 防爆。

    public MyTask(Context context, Activity activity,
                    String url,String postExecuteAction) {
}

在你的帖子中执行只检查if else中的每个案例并执行相应的任务

答案 2 :(得分:0)

虚拟背景类

 private class BackGroundClass extends AsyncTask<String, Void, Bitmap> //<arg to do InBackground,,returntype of do inBackground and arg of onPostExecut>

{

 public BackGroundClass()
    {

    }

 @Override
    protected void onPreExecute() //forground work in UI thread prior to doInbackground
    {
        super.onPreExecute();

    }

    @Override
    protected Bitmap doInBackground(String... urls) //background work in parallel thread
    {
        Bitmap b=null;
       // your background work
        return b;
    }

    @Override
    protected void onPostExecute(Bitmap result) //forground work in UI thread post to doInbackground
    {
        super.onPostExecute(result);
        if(result!=null)
        {               
            //use bitmap image in result    
        }
       else
       {   
          //Image is not available
       }    

    }

  }

要求执行一次“

new BackGroundClass().execute(StringArg1,stringArg2,StringArg3);

呼吁执行多个parellel

当tou需要同时调用多个后台任务时

new BackGroundClass().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,StringArg1,stringArg2,StringArg3);

从单一活动中调用

将此作为您的活动的内部类,以便在不从多个活动调用时轻松共享变量

来自多个活动

使用构造函数传递活动上下文和其他变量

new BackGroundClass(constructor arguments).execute(StringArg1,stringArg2,StringArg3);

  new BackGroundClass(constructor arguments).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,StringArg1,stringArg2,StringArg3);