我正在使用类扩展Asynctask从webservice下载数据。为了防止数据丢失和请求超时,我试图重复asynctask并每100行读取一次数据。但是循环错误并且从不运行任务:
重复任务的功能:
public void executeCustomer(String vSpvId){
String vURL;
int vloop = 1;
while(notStop){
vURL = Routines.URL_CUSTOMER + "?vloop=" + String.ValueOf(vLoop) + "&vsupvid=" + vSpvId;
Log.d(TAG, vURL);
vCustomerAsyncTask = new CustomerAsyncTask();
vCustomerAsyncTask.execute(vURL);
vloop++;
}
}
下载数据的任务:
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);
}
}
我的问题是如何在完成下载第一个数据时重复asynctask,然后重复自己来执行下一个URL参数。当我检查logcat时,循环总是运行但是任务从未完成。所以,如何使它可以运行dan重复asynctask。
答案 0 :(得分:0)
保留静态计数器并调用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
中..当前你做的事情可能无法工作因为你在其他人完成之前就开始了一个AsyncTask ......
答案 1 :(得分:0)
我们无法执行两次或多次AsyncTask。因此,每次我们只在本地创建实例时。像new MyTask().execute(url).
一样避免异步任务实例的全局声明。另外我们可以使用Loader类多次执行异步任务,这也是向后兼容的。
答案 2 :(得分:0)
用于再次调用它,就像一个回归形式`name.excuteTask()'