3

このファイルの内容を取得し、それを文字列に保存したいと思います。

AsyncTask を使用してみました (この回答に基づいて)。これが私のクラスです。

class RetreiveURLTask extends AsyncTask<Void, Void, String> {

    private Exception exception = null;
    public String ResultString = null;

    protected String doInBackground(Void ... something) {
        URL url;
        try {
            url = new URL("http://stream.lobant.net/ccfm.info");
            HttpURLConnection urlConnection;
            urlConnection = (HttpURLConnection) url.openConnection();
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            String stream_url = IOUtils.toString(in, "UTF-8");
            urlConnection.disconnect();

            return stream_url;

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        } catch (Exception e) {
            this.exception = e;
            return null;
        }
    }

    protected void onPostExecute(String stream_url) {
    // TODO: check this.exception 
    // TODO: do something with the feed
    if (this.exception != null)
        this.exception.printStackTrace();

    this.ResultString = stream_url;
    }
}   

AsyncTask クラスを次のように使用してみました。

  AsyncTask<Void, Void, String> stream_task = new RetreiveURLTask().execute();
  String stream_url = stream_task.ResultString;

しかし、ResultString は認識されません。

これがどのように機能するかについて私は混乱しています。AsyncTask はバックグラウンドで実行されるため、文字列をパブリック変数の 1 つに割り当てることができたとしても、割り当てを行ったときにそれが有効であるという保証はありません。何らかの getResult() 関数を使用する場合でも、コードの実行が完了するように呼び出すタイミングを知る必要があります。

では、これは通常どのように行われるのでしょうか。

(また、私の http 読み取りコードは大丈夫ですか?)


私の能力: コーディングはできますが、Android は初めてです。

4

4 に答える 4

4
// try this way

  RetreiveURLTask task = new RetreiveURLTask();
  task.execute();

 private void response(String responseData){
        // here you write your code which use responseData
 }
 class RetreiveURLTask extends AsyncTask<Void, Void, String> {

        private Exception exception = null;
        public String ResultString = null;

        protected String doInBackground(Void ... something) {
            URL url;
            try {
                url = new URL("http://stream.lobant.net/ccfm.info");
                HttpURLConnection urlConnection;
                urlConnection = (HttpURLConnection) url.openConnection();
                InputStream in = new BufferedInputStream(urlConnection.getInputStream());
                String stream_url = IOUtils.toString(in, "UTF-8");
                urlConnection.disconnect();

                return stream_url;

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            } catch (Exception e) {
                this.exception = e;
                return null;
            }
        }

        protected void onPostExecute(String stream_url) {
            // TODO: check this.exception 
            // TODO: check this.exception 
            // TODO: do something with the feed
            super.onPostExecute(stream_url);
            response(stream_url)
        }
    }
于 2013-09-18T10:51:48.787 に答える
1

これ作って

        public String ResultString = "";  

グローバル

ここでは Asynctask はメイン クラスではありません。それが理由です。ResultString cannot be resolved or is not a field

グローバル変数にすると、アクセスできるようになります

于 2013-09-18T13:43:46.117 に答える
0

AsyncTask の実行はバックグラウンドで開始されますが、割り当ては実行開始直後に実行されます。したがって、割り当ては AsyncTask の実行が完了する前に実行されます。

最善の策は、OnPostExecute() メソッドで割り当てを行うことです。

于 2013-09-18T10:55:53.057 に答える