0

我正在使用类扩展 Asynctask 来从 web 服务下载数据。为了防止数据丢失和请求超时,我尝试重复异步任务并每 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 时,循环始终运行,但任务从未完成。那么,如何使它可以运行但重复异步任务。

4

3 回答 3

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 完成之前就开始了一个 AsyncTask ......

于 2012-04-16T09:33:12.927 回答
0

我们不能执行 AsyncTask 两次或更多次。所以,每次我们只在本地创建实例。比如new MyTask().execute(url).避免异步任务实例的全局声明。另一件事是我们可以使用Loader类多次执行异步任务,它也具有向后兼容性。

于 2012-04-16T09:41:12.427 回答
0

用于再次调用它,就像回归形式 `name.excuteTask()'

于 2012-04-16T09:41:41.700 回答