从Android中的AsyncTask检索返回的字符串

时间:2013-09-18 10:42:26

标签: android android-asynctask

我想检索this file的内容并将其保存为字符串。

我尝试过使用AsyncTask(基于this answer),这是我的课程。

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 个答案:

答案 0 :(得分: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
 }

答案 1 :(得分: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)
        }
    }

答案 2 :(得分:1)

制作本

        public String ResultString = "";  

全球

Asynctask不是这里的主要类,这就是你获得ResultString cannot be resolved or is not a field

的原因

将其设为全局变量,然后您就可以访问它了

答案 3 :(得分:0)

AsyncTask的执行在后台启动,而赋值在执行开始后立即执行。因此,在AsyncTask执行完成之前执行赋值。

最好的办法是在OnPostExecute()方法中进行分配。