0

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

これは私が現在使用しているコードであり、ASyncTaskのdoInBackgroundから呼び出されています。

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

私は現在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;
   }
4

2 に答える 2

1

使えませんAsyncTask.cancel()か?onCancelledその後、コールバックを使用してメインアクティビティに戻ることができるはずです。

于 2011-02-06T16:31:13.533 に答える
1

わかりました、私はこれを解決したと思います。

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

ただし、ユーザーが進行状況ダイアログをキャンセルすると、failedはtrueに設定され、ユーザーはへの呼び出しによって前のアクティビティに戻されfinishedます。その間、Downloaderまだダウンロードで忙しいです。結果は不要になったため、リソースの使用をできるだけ早く停止する必要があります。これを達成するために、私はdoInBackground可能な限り多くのステップでメソッドを分割しました。各ステップの後、failedまだ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) {
        }
}

ダウンロードプロセスをさらに細かく分割できたかもしれませんが、非常に小さなファイルをダウンロードしているので、それほど重要ではありません。

于 2011-03-24T18:17:52.733 に答える