【问题标题】:Reading txt files from URL into EditText on Android Honeycomb, getting NetworkOnMainThreadException将 txt 文件从 URL 读取到 Android Honeycomb 上的 EditText,得到 NetworkOnMainThreadException
【发布时间】:2011-08-05 00:40:37
【问题描述】:

我正在尝试编写一个接收 URL 并将其文本内容显示到 EditText 视图的代码 sn-p。这并不顺利,我已经研究了我认为可以给出答案的其他链接,例如从此处描述的 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;
        }         
    }

点击获取url的按钮时执行:

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

所以通过将东西放在 asynctask 中,我认为我可以绕过蜂窝 3.0 NetworkOnMainThreadException 但似乎不是。有什么想法可以尝试下一步吗?

【问题讨论】:

    标签: android httpclient android-3.0-honeycomb


    【解决方案1】:

    您似乎没有将实际的网络调用放在 AsyncTask 的 doInBackground 方法中。这通常是您想要做的,然后 onPostExecute 将被调用。我认为您的 onPostExecute 会在您启动 AsyncTask 后立即被调用,因为您在 doInBackground 中没有执行任何操作。

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

    据我所知,它是这样运行的:

    单击按钮 > 调用 AsyncTask > 后台线程中没有发生任何事情 > 调用 postExecute 尝试 .setText(NETWORK CALL) ...返回您的 UI 线程。

    如果我错了,请纠正我。也许我看错了?

    【讨论】:

    • 做到了,现在我只需要弄清楚如何将返回的字符串与换行符一起呈现到EditView 的Android 视图中。
    【解决方案2】:

    getStringFromUrl 和getInputStreamFromUrl 需要在doInBackground() 中调用。您可以返回文本并将其设置为onPostExecute 中的文本视图,而不是从doInBackground() 返回boolean。只有 doInBackground() 方法在新线程中运行,因此您需要在此处完成所有与网络相关的工作并更新 onPostExecute() 中的 UI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多