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