1

我使用此代码从 html 页面读取数据并放入 webview

public class MainActivity extends Activity {
public WebView objwebview ;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    objwebview = (WebView)findViewById(R.id.webView1);
          HttpClient client = new DefaultHttpClient();
          HttpGet request = new HttpGet("http://www.google.com");
          try
          {
              HttpResponse response = client.execute(request);
              BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
              String line;
              StringBuilder str = new StringBuilder();
              while((line = reader.readLine()) != null) {
                  str.append(line);
          }
              objwebview.loadData(str.toString(), "text/html", "UTF-8");
      }
      catch(Exception e)
      {
          e.printStackTrace();
          objwebview.loadData(e.toString(), "text/html", "UTF-8");
      }

但是当我运行它时,我给出了这个错误(“android.os.networkonmainthreadexception”)我该如何解决这个问题?

4

2 回答 2

3

您正在Android的主线程上运行网络代码。阅读本文以找到您问题的部分答案。

基本思想是,如果您执行不立即返回的同步读取(即需要很长时间的事情,例如网络操作),您需要在另一个线程上执行此操作,然后将结果传达回 GUI。

您有几个选项可以做到这一点:您可以使用AsyncTask,它允许您轻松地将更新发布到 UI,或者您可以使用背景Service以及相关的通信(通过 AIDL 或更简单的消息和处理程序)。

于 2012-12-07T18:51:12.980 回答
2

您正在主线程中访问网络连接。将以下行粘贴到 setContentView(your_layout);

// Allow network access in the main thread
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
于 2013-10-03T13:33:09.260 回答