3

この質問は、少し前に質問され、回答されました。リンク。しかし、答えはまだ私を助けませんでした。私は他の投稿のOPと同じような立場にあります。特定のウェブサイトに接続する非同期タスクがありますが、インターネット接続が遅いため、ほとんどの場合、接続に時間がかかります。ユーザーがいつでも接続の試行を停止できるようにしたいと思います。

public class DownloadWebHtml extends AsyncTask<String, Void, Map<String,ArrayList<ArrayList<String>>>> {        
        HttpURLConnection con = null;

        @Override
        protected void onPreExecute(){
            Button but = (Button) findViewById(301);
            but.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    cancel(true);
                    con.disconnect();
                }
            });
        }

        @Override
        protected Map<String, ArrayList<ArrayList<String>>> doInBackground(String... urlcodes) {
            //stuff
            BufferedReader in = null;
            try {
                URL url = new URL("some url");
                con = (HttpURLConnection) url.openConnection();
                in = new BufferedReader(new InputStreamReader(con.getInputStream(),Charset.forName("ISO-8859-1")));
                String line = "";
                while ((line = in.readLine()) != null && !isCancelled()) {
                    html.add(line);
                }
                in.close();
            } catch (MalformedURLException e) {
                return null;
            } catch (IOException e) {
                return null;
            } finally {
                con.disconnect();
                 if (in != null) {
                     try {
                         in.close();
                     } catch (IOException e) {
                         Log.d("gettxt", e.getMessage());
                     }
                 }
            }

            if(!html.isEmpty()) {
                return //stuff;
            }
            return null;

        }

        @Override
        protected void onCancelled(){
            //cancellation
        }


    //onpostexecute doing stuff
}

ボタンが押されるたびに、接続が確立された後にのみAsyncTask全体がキャンセルされます。ボタンを押すだけでプロセス全体をすぐに停止することは可能ですか?デフォルトのhttpurlconnectionを使用して実行できますか?

con.getInputStreamがビジー状態のときに切断を使用して例外をトリガーしようとしましたが、機能しませんでした。

4

1 に答える 1

1

ApacheのHTTPコンポーネントに切り替えることをお勧めします。ここで概説するように、それは魅力的に機能し、スレッドセーフなabort方法を備えています。

于 2012-10-31T15:32:50.067 に答える