将URL中的txt文件读取到Android Honeycomb上的EditText,获取NetworkOnMainThreadException

时间:2011-08-04 16:26:19

标签: android httpclient android-3.0-honeycomb

我正在尝试编写一段代码片段,其中包含一个URL并将其文本内容显示在EditText视图中。这不顺利,我已经研究了其他链接,我认为给出了答案,例如从这里描述的AsyncTask进行网络调用:

Android Honeycomb: Fragment not able to start AsyncTask?

但这似乎不起作用。它实际上是我试图在这里使用的一个函数(调用另一个函数)。发布这些功能是为了完整性:

  public static InputStream getInputStreamFromUrl(String url){
            InputStream contentStream = null;

            try{
              HttpClient httpclient = new DefaultHttpClient();
              HttpResponse response = httpclient.execute(new HttpGet(url));
              contentStream = response.getEntity().getContent();
            } catch(Exception e){
               e.printStackTrace();
            }
            return contentStream;
         }

  public static String getStringFromUrl(String url)  {
         BufferedReader br = new BufferedReader(new InputStreamReader(getInputStreamFromUrl(url)));

         StringBuffer sb = new StringBuffer();

         try{
          String line = null;

          while ((line = br.readLine())!=null){
           sb.append(line);
          }
         }catch (IOException e){
          e.printStackTrace();
         }
         return sb.toString();
  }

这些是从我的:

调用的
private class FragmentHttpHelper extends AsyncTask<Void, Void, Boolean>{
         protected void onPostExecute(Boolean result) {
                    contractTextTxt.setText(getStringFromUrl(urlReferenceTxt.getText().toString()));
            }
        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return true;
        }         
    }

单击获取网址按钮时执行的操作:

        retrieveURLReferenceBtn.setOnClickListener(new OnClickListener() {  
        public void onClick(View arg0) {
                new FragmentHttpHelper().execute();
        }
    });

所以把东西放在一个asynctask我想我会绕过蜂窝3.0 NetworkOnMainThreadException但似乎没有。任何想法接下来要尝试什么?

2 个答案:

答案 0 :(得分:1)

看起来您没有在AsyncTask中的doInBackground方法中进行实际的网络调用。这通常是你想要做的,然后将调用onPostExecute。我认为你的onPostExecute一旦启动AsyncTask就会被调用,因为你在doInBackground中没有做任何事情。

尝试将您的HttpClient代码移动到doInBackground方法中。

从我可以告诉它的运行方式如下:

点击按钮&gt;调用AsyncTask&gt;背景线程中没有任何事情发生&gt;调用postExecute尝试.setText(NETWORK CALL)...它回到你的UI线程上。

如果我错了,请纠正我。也许我看到了这个错误?

答案 1 :(得分:1)

需要在getStringFromUrl中调用

getInputStreamFromUrldoInBackground()。您可以返回文本并将其设置为boolean中的文本视图,而不是从doInBackground()返回onPostExecute。只有doInBackground()方法在新线程中运行,因此您需要在此处执行所有与网络相关的内容,并在onPostExecute()中更新UI。