我有两个AsyncTask,第一个是http请求#1,另一个是另一个请求。我想一个接一个地打电话:
new AsyncCallerTickets().execute();
new AsyncCallerContacts().execute();
有可能吗?
我的任务是:
private class AsyncCallerTickets extends AsyncTask<Void, Void, Void>
{
SpotsDialog dialog = new SpotsDialog(TicketsDetailsContacts.this, R.style.Custom);
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setCancelable(false);
dialog.setMessage(getString(R.string.dialog_wait));
dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
responseStringTickets = mRequestTickets(urlTickets);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
dialog.dismiss();
}
}
和
private class AsyncCallerContacts extends AsyncTask<Void, Void, Void>
{
SpotsDialog dialog = new SpotsDialog(TicketsDetailsContacts.this, R.style.Custom);
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setCancelable(false);
dialog.setMessage(getString(R.string.dialog_wait));
dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
responseStringTickets = mRequestTickets(urlContacts);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
dialog.dismiss();
}
}
有人能解释我怎么做吗? 提前谢谢。
答案 0 :(得分:1)
使用ExecutorService
和Runnable
代替AsyncTask
ExecutorService schTaskEx = Executors.newFixedThreadPool(1);
schTaskEx.execute(r);
//more runnable : schTaskEx.execute(r1);
//more runnable : schTaskEx.execute(r2);
//etc
其中r
是您的可运行。
Runnable r = new Runnable() {
public void run() {
//your code in backgroud thread is here
}
};
答案 1 :(得分:1)
您可以尝试通过在第一个异步任务的onPostExecute中调用的回调方法中启动第二个来逐个调用。
完整的草图解决方案如下:
public CustomActivity extends Activity{
@Override
void onCreate(Bundle saveInstance){
super.onCreate(saveInstance);
new AsyncCallerTickers(mCallback1).execute();
}
public Callback mCallback1 = new Callback{
@Override
public void onSuccess(){
new AsyncCallerContacts().execute();
}
@Override
public void onFail(){
}
}
public interface Callback {
void onSuccess();
void onFail();
}
}
// asynctask classes
public class AsyncCallerTickets extends AsyncTask<Void, Void, Void> {
SpotsDialog dialog = new SpotsDialog(TicketsDetailsContacts.this, R.style.Custom);
private CustomActivity.Callback callback;
public AsyncCallerTickets(CustomActivity.Callback _callback){
this.callback = _callback;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setCancelable(false);
dialog.setMessage(getString(R.string.dialog_wait));
dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
responseStringTickets = mRequestTickets(urlTickets);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
dialog.dismiss();
if(result!=null){
callback.onSucces();
}
else{
callback.onFail();
}
}
}
public class AsyncCallerContacts extends AsyncTask<Void, Void, Void> {
SpotsDialog dialog = new SpotsDialog(TicketsDetailsContacts.this, R.style.Custom);
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog.setCancelable(false);
dialog.setMessage(getString(R.string.dialog_wait));
dialog.show();
}
@Override
protected Void doInBackground(Void... params) {
responseStringTickets = mRequestTickets(urlContacts);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
dialog.dismiss();
}
}
一般来说,我喜欢将它们放在单独的类中,并附带一些回调,在Ui中,我开始执行回调的任务,当异步任务返回成功时,我启动第二个。把事情简单化。
答案 2 :(得分:0)
尝试在第一个AsyncTask的onPostExecute()中执行第二个AsyncTask作为解决方法!!