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 在后台运行,即使我可以将我的字符串分配给公共变量之一,也不能保证在我进行分配时它是有效的。即使我要使用某种 getResult() 函数,我也需要知道何时调用它,以便代码完成执行。

那么,这通常是如何完成的呢?

(另外,我的 http 读取代码可以吗?)


我的能力:我可以编码,但对 android 很陌生。

4

4 回答 4

9

使用接口

new RetreiveURLTask(ActivityName.this).execute();

在你的 asyctask

TheInterface listener;

在构造函数中

 public RetreiveURLTask (Context context)
{

    listener = (TheInterface) context;
}  

界面

public interface TheInterface {

    public void theMethod(String result);

     }

在 onPostExecute

if (listener != null) 
  {
  listener.theMethod(stream_url);
  }

在您的活动类中实现接口

 implements RetreiveURLTask.TheInterface

实现方法

 @Override
 public void theMethod(String result) {
 // update ui using result
 }
于 2013-09-18T10:48:54.017 回答
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 回答