2012-12-07 75 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)。