2011-02-06 13 views
0

私のアプリケーションでは、htmlページをダウンロードして解析します。しかし、私はそのトラックでダウンロードを止めることができたいと思っています(つまり、ユーザーがキャンセルを押すと)。Androidのダウンロードを停止する

これは私が今使っているコードで、ASyncTaskからdoInBackgroundから呼び出されています。

このリクエストをASyncTaskの外部からキャンセルするにはどうすればよいですか?

私は現在、あなたがAsyncTask.cancel()を使用することはできませんhtmlcleaner

HtmlCleaner cleaner = new HtmlCleaner(); 
    CleanerProperties props = cleaner.getProperties(); 
    props.setAllowHtmlInsideAttributes(true); 
    props.setAllowMultiWordAttributes(true); 
    props.setRecognizeUnicodeChars(true); 
    props.setOmitComments(true); 
    try { 
     URL url = new URL(urlstring); 
     URLConnection conn = url.openConnection(); 
     TagNode node = cleaner.clean(new InputStreamReader(conn.getInputStream())); 
     return node; 
    } catch (Exception e) { 
     failed = true; 
     return; 
    } 

答えて

1

[OK]を、私はこれを解決したと思います。

私のアクティビティクラスには、変数(ブール値)failedがあります。また、ASyncTaskに拡張されたアクティビティ内にプライベートDownloaderクラスがあります。このようにして、Downloaderクラスはfailedブール値にアクセスできます。アクティビティーが起動すると、Downloaderタスクが開始され、進行状況ダイアログがポップアップします。タスクが終了すると、ダイアログが閉じられ、ダウンロードされたコンテンツの処理が続行されます。

ただし、ユーザが進捗ダイアログをキャンセルすると、failedがtrueに設定され、ユーザはfinishedを呼び出して前のアクティビティに戻されます。その間、Downloaderはまだダウンロード中です。結果は不必要であるため、リソースの使用をやめてください。これを達成するために、できるだけ多くの手順でdoInBackgroundメソッドを分割しました。各ステップの後に、がまだfalseであるかどうかを確認し、それがtrueに設定されている場合、単に次のステップに進まない。以下のアクションでそれを見てください。さらに、BufferedReader readerは公開されており、onCancelledメソッドではreader.close()を実行します。これはあらゆる種類の例外をスローしますが、これらは適切にキャッチされます。

public void DoInBackground(.........) { 
    try { 
     URL url = new URL(uri); 
     URLConnection conn = url.openConnection(); 
     if (!failed) { 
      isr = new InputStreamReader(conn.getInputStream()); 
      if (!failed) { 
       reader = new BufferedReader(isr); 
       publishProgress(1); 
       if (!failed) { 
        TagNode node = cleaner.clean(reader); 
        publishProgress(2); 
        return node; 
       } 
      } 
     } 
    } catch (Exception e) { 
      failed = true; 
      Log.v("error",""+e); 
    } 
} 

@Override 
protected void onCancelled() { 
    failed = true; 
    if (reader != null) 
     try { 
      reader.close(); 
     } catch (IOException e) { 
      failed = true; 
     } 
    if (isr != null) 
     try { 
      isr.close(); 
     } catch (IOException e) { 
     } 
} 

私は、私も誇らしげビットでのダウンロード処理を分割している可能性があることを知っているが、私は非常に小さなファイルをダウンロードしていますので、それはそれは重要ではありません。

1

を使うのか? onCancelledコールバックを使用してメインアクティビティに戻ることができるはずです。

+0

ダウンロードを自動的に停止しますか?ダウンロードにはURLConnectionクラスを使用します。 –

+0

いいえ、それはそうでないことが分かります(このドキュメントでは間違っています - 'AsyncTask.cancel(true)を呼び出すことによってタスクが実際に実行されなくなるわけではありません。)実際にダウンロードするコードを投稿できますか? – ns476

+0

I質問に追加しました。あなたのおかげでありがとう! –

関連する問題