2012-12-07 74 views
2

我用读数据这个代码的HTML页面中网页数据,并把中的WebView阅读的Android

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”) 我该如何解决这个问题?

回答

2

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

// Allow network access in the main thread 
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
+0

除非强制执行,否则无法在主线程中执行网络IO操作。通过使用上述两行,您可以让主线程访问网络并执行任何网络操作。 –

+2

这是*不是一个好的解决方案。特别是,即使它允许您摆脱异常,它也会削弱您的应用程序的用户界面。所以它基本上就像关掉安全警卫。 –

+0

是的,它会使应用程序挂起等待响应。但在一些独家案件中仍然有所帮助。这一个是信息。我会高兴 – Sayka

3

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

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

你有几个选项来做到这一点:你可以使用一个AsyncTask,它允许你怕疼更新发布到用户界面,也可以沿着使用背景Service与相关的通信(通过AIDL或一个简单的留言和Handler)。