Android 如何在任务本身完成后重复该任务
我正在使用类扩展Asynctask从webservice下载数据。为了防止数据丢失和请求超时,我尝试重复asynctask并每100行读取一次数据。但是循环错误并从未运行任务: 函数以重复该任务: 下载数据的任务:Android 如何在任务本身完成后重复该任务,android,android-asynctask,Android,Android Asynctask,我正在使用类扩展Asynctask从webservice下载数据。为了防止数据丢失和请求超时,我尝试重复asynctask并每100行读取一次数据。但是循环错误并从未运行任务: 函数以重复该任务: 下载数据的任务: 我的问题是如何在asynctask完成下载第一个数据后重复它,然后自己重复它来执行下一个URL参数。当我签入logcat时,循环总是运行,但任务从未完成。那么,如何使它能够运行并重复asynctask。保留一个静态计数器并调用asynctask 像这样 if(counter<d
我的问题是如何在asynctask完成下载第一个数据后重复它,然后自己重复它来执行下一个URL参数。当我签入logcat时,循环总是运行,但任务从未完成。那么,如何使它能够运行并重复asynctask。保留一个静态计数器并调用asynctask 像这样
if(counter<desiredCount){
vURL = Routines.URL_CUSTOMER + "?vloop=" + String.ValueOf(vLoop) + "&vsupvid=" + vSpvId;
Log.d(TAG, vURL);
vCustomerAsyncTask = new CustomerAsyncTask();
vCustomerAsyncTask.execute(vURL);
}
在AsyncTask的post excecute中。。您当前所做的可能不起作用,因为您在另一个异步任务完成之前启动了一个异步任务…我们不能执行两次或更多次异步任务。因此,每次我们仅在本地创建实例时。likew MyTask.executeurl。避免异步任务实例的全局声明。还有一件事,我们可以使用类多次执行异步任务,它也具有向后兼容性。使用类似于“name.excuteTask”的回归形式再次调用它。但是我不知道有多少行,所以我无法初始化静态计数器,我认为静态计数器无法使用。在我的解析函数中,我使用唯一的代码来初始化进程何时停止或运行。。。。。请尝试{Log.dTAG,vASPXResult;ifvASPXResult.indexOfC@==0{//function to parsing data//return true to read next data from webservice return=true;}否则,如果vASPXResult.indexOfF@==0{//Function to parsing data//return false to stop read data from webservice return=false;}……如果我理解正确,就没有必要使用例如10个AsyncTask,依次下载10个URL。在您的情况下,只需构造和准备10个URL,并将URL列表传递到单个AsyncTask中,然后在doInBackground方法中,正确实现for循环以依次迭代和处理URL。最后,我找到了解决方案…Jus不要在post execute TILL stop条件中使用新参数再次调用任务。就像递归函数一样…@PaijoRX:Cool!就是这样。你知道了。但是请确保停止条件不会太长。并检查它是否会影响你的应用程序检测处理程序。
private class CustomerAsyncTask extends AsyncTask<String, Void, String>{
@Override
protected void onPreExecute() {
showProgressBar(Routines.WAIT);
}
@Override
protected String doInBackground(String... vURL) {
String vASPXText = Routines.getASPXText(vURL[0]);
return vASPXText;
}
@Override
protected void onPostExecute(String vASPXResult) {
super.onPostExecute(vASPXResult);
try{
if((vASPXResult.length() == 0)||(vASPXResult.contains("masalah"))){
vDialogBox.dismiss();
Toast.makeText(getApplicationContext(), Routines.DATABASE_ERROR, Toast.LENGTH_SHORT).show();
throw new NullPointerException(Routines.DATABASE_ERROR);
}
}catch(NullPointerException e){
e.printStackTrace();
Log.w(TAG, Routines.DATABASE_ERROR);
vDialogBox.dismiss();
showDialogBox(Routines.WARNING, Routines.DATABASE_ERROR);
return;
}
vDialogBox.dismiss();
notStop = parsingCustomer(vASPXResult);
}
}
private boolean parsingCustomer(String vASPXResult){
try{
Log.d(TAG, vASPXResult);
if(vASPXResult.indexOf("C@`") == 0){
// function to parse data
// return true to read next data from webservice
return = true;
}else if (vASPXResult.indexOf("F@`") == 0){
// function to parse data
// return false to stop read data from webservice
return = false;
}
}catch (StringIndexOutOfBoundsException e) {
e.printStackTrace();
Log.e(TAG, Routines.DATABASE_ERROR);
showDialogBox(Routines.WARNING, Routines.DATABASE_ERROR);
}
}
if(counter<desiredCount){
vURL = Routines.URL_CUSTOMER + "?vloop=" + String.ValueOf(vLoop) + "&vsupvid=" + vSpvId;
Log.d(TAG, vURL);
vCustomerAsyncTask = new CustomerAsyncTask();
vCustomerAsyncTask.execute(vURL);
}