4

サーバーから大量のデータをダウンロードする必要があります。ダウンロードには最低 10 秒かかります。ayntask クラスを使用してダウンロードするコードを次に示します。また、ダウンロード中にホームボタンをクリックした場合、無条件にダウンロードをキャンセルしたいです。問題は... cancel() メソッドを実行していますが、ダウンロード操作がキャンセルされません。アプリケーションを終了しても、logcat ビューでバックグラウンドで操作が実行されていることがわかります。doInBackground() メソッドの実行を停止したいだけです。ガイド/助けてください。

ダウンロードボタンをクリックすると:

  dwnldTask = new DownloadTask ();
  dwnldTask.execute(SERVER_URL);

そして、ここに Asynctask クラスがあります:

 class DownloadTask extends AsyncTask<String, Void, Object>{
    private Object response = null;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

         displaying progress dialog on UI 
    }
    @Override
    protected Object doInBackground(String... params) {
        try{   

             DataConnection dc = new DataConnection();

             this.response = dc.connectToServer(params[0]);

            if(isCancelled()){
                return null;
            }


        }catch (Exception e) {
            if(isCancelled()){
                return null;
            }   
            e.printStackTrace();
            showToastMSG(e.getMessage());
        }  

        return this.response ;
    }

    @Override
    protected void onPostExecute(Object response) {
        super.onPostExecute(response);

        if(response != null ){ 
            successfully downloaded...  go to next activity
             } 
            cancel progress dialog here
    }

} 

内部 onPause()..

  @Override
protected void onPause() {
    super.onPause();
    if(dwnldTask != null && dwnldTask.getStatus() == AsyncTask.Status.RUNNING){
        dwnldTask.cancel(true);
    }  
     cancel the progress dialog if it is showing

}

DataConnection という名前の別のクラスにあるメソッドを次に示します...

  public Object connectToServer(String url) throws Exception{
    HttpGet request = new HttpGet(url);
    request.addHeader("accept","application/json");
    HttpResponse response = httpClient.execute(request);   
    HttpEntity httpEntity = response.getEntity();
    InputStream responseInputStream = httpEntity.getContent();
    return myUtilObject.convertInputStreamToString(responseInputStream);
}
4

2 に答える 2

3

ダウンロードを実行した後にメソッドをチェックしているisCancelled()ので、途中でキャンセルされる理由はありません。

通常、次のようなことを行います。

while (!isCancelled()) {
 // Download next buffer..
}

この場合、キャンセル要求が行われるとループは停止します。

于 2013-02-06T08:34:42.973 に答える
3

私はRanに同意します-あなたは次のコードを書きませんでした: myUtilObject.convertInputStreamToString しかし、あなたがそのサイズを事前に定義したバッファで入力ストリームをループすると推測しています(おそらくBufferedReaderで?)-このループでは、非同期スレッドの停止条件を確認する必要があります- isCancelled()が良い例です。

スレッドがキャンセルされた場合、ループは停止する必要があります。つまり、次のようになります。

String line = "";
StringBuilder total = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is), 1024);
while ((line = rd.readLine()) != null && !isCancelled())
{
     total.append(line);
}
于 2013-02-06T09:43:52.727 に答える