12

以下のコードのように、AsyncTask を使用して URLPath を接続します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.left_list);

    Button btn = (Button)findViewById(resid);
    btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //how to stop connect
        }
    });
    new Connecting().execute();
}


class Connecting extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
            super.onPreExecute();
        //do something
    }

        @Override
        protected String doInBackground(String... aurl) {
            try {
                URL url = new URL(URLPath);
                connection = (HttpURLConnection)url.openConnection();
                connection.setConnectTimeout(30000);
                connection.setReadTimeout(30000);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                connection.connect();
                is = connection.getInputStream();

            }
            catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String unused) {
            super.onPostExecute(unused);
        //access InputStream is
        }
}

接続に時間がかかる場合があります。
接続中にBボタンボタンを押すと接続が切れるように設定したい。
setOnClickListener メソッドで設定するにはどうすればよいですか?

4

2 に答える 2

22

使用するコードを で囲みHttpURLConnectionますFuture。これは自由にキャンセルできます。のタイムアウトは信頼できないFutureため、 のタイムアウト機能を使用することもできます。HttpURLConnection

ネットワーキング クラス内でエグゼキューターとフューチャーを定義します。

final ExecutorService executor = Executors.newCachedThreadPool(Executors.defaultThreadFactory());
Future<MyResult> future;

Future次に、ネットワーク コードを次のようにラップします。

future = executor.submit(new Callable<MyResult>() {
    @Override
    public MyResult call() throws IOException {
        HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
        try {
            // .. use the connection ...
        } finally {
            connection.disconnect();
        }
    }
});

MyResult result = future.get(TIMEOUT, TimeUnit.SECONDS);

キャンセルしたい場合は、任意のスレッドからこの呼び出しを行うことができます:

future.cancel(true);

future がタイムアウトするか取り消された場合、接続タスクは引き続きHttpURLConnectionメソッドでブロックされますが、アプリケーションは保留されません。スレッドとネットワーク ソケットの解放を高速化するために、接続に適切なタイムアウトを設定する必要があります。

于 2014-10-21T14:22:49.327 に答える