0

クラス extends Asynctask を使用して、Web サービスからデータをダウンロードしています。データの損失とリクエストのタイムアウトを防ぐために、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 をチェックインすると、ループは常に実行されますが、タスクは実行されません。では、asynctask を繰り返し実行できるようにする方法を説明します。

4

3 に答える 3

0

AsyncTask を 2 回以上実行することはできません。そのため、毎回ローカルでのみインスタンスを作成します。同様new MyTask().execute(url).に、非同期タスクインスタンスのグローバル宣言を避けます。また、 Loaderクラスを使用して Async タスクを複数回実行することもできます。これには下位互換性もあります。

于 2012-04-16T09:41:12.427 に答える
0

回帰形式の「name.excuteTask()」のように再度呼び出すために使用します。

于 2012-04-16T09:41:41.700 に答える
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つのAsyncTaskを開始すると機能しない可能性があります...

于 2012-04-16T09:33:12.927 に答える