Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在任务本身完成后重复该任务_Android_Android Asynctask - Fatal编程技术网

Android 如何在任务本身完成后重复该任务

Android 如何在任务本身完成后重复该任务,android,android-asynctask,Android,Android Asynctask,我正在使用类扩展Asynctask从webservice下载数据。为了防止数据丢失和请求超时,我尝试重复asynctask并每100行读取一次数据。但是循环错误并从未运行任务: 函数以重复该任务: 下载数据的任务: 我的问题是如何在asynctask完成下载第一个数据后重复它,然后自己重复它来执行下一个URL参数。当我签入logcat时,循环总是运行,但任务从未完成。那么,如何使它能够运行并重复asynctask。保留一个静态计数器并调用asynctask 像这样 if(counter<d

我正在使用类扩展Asynctask从webservice下载数据。为了防止数据丢失和请求超时,我尝试重复asynctask并每100行读取一次数据。但是循环错误并从未运行任务:

函数以重复该任务:

下载数据的任务:


我的问题是如何在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);
}