【问题标题】:How to repeat AsyncTask after itself complete如何在自身完成后重复 AsyncTask
【发布时间】:2014-02-17 20:31:05
【问题描述】:

我正在使用类扩展 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 时,循环始终运行,但任务从未完成。那么,如何让它可以重复异步任务运行。

【问题讨论】:

  • 如果我没看错的话,没有必要使用例如 10 个 AsyncTask 依次下载 10 个 URL。在您的情况下,只需构造和准备 10 个 URL,并将 URL 列表传递给单个 AsyncTask,然后在 doInBackground() 方法中,正确实现您的 for 循环以按顺序迭代和处理 URL。

标签: android android-asynctask


【解决方案1】:

保留一个静态计数器并调用 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...

【讨论】:

  • 但是我不知道有多少行,所以我无法初始化静态计数器,我认为静态计数器不能使用。
  • 在我的解析函数中,我使用唯一代码来初始化进程何时停止或运行。 ..... try{ Log.d(TAG, vASPXResult); if(vASPXResult.indexOf("C@") == 0){ // funtion to parsing data // return true to read next data from webservice return = true; }else if (vASPXResult.indexOf("F@") == 0){ // 解析数据的功能 // return false 停止从 webservice 读取数据 return = false; } } ......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 终于,我找到了解决方案...只需在执行后使用新参数再次调用任务,直到停止条件。像递归函数...
    • @PaijoRX:酷!就是这样。你说对了。但请确保您的停止条件不会太长。并检查它是否会影响您的应用程序检测处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2023-03-19
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多