从Android网页上读取数据

时间:2012-12-07 18:45:40

标签: android httpclient

我使用此代码从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”) 我该如何解决?

2 个答案:

答案 0 :(得分:3)

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

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

您可以选择执行以下操作:您可以使用AsyncTask,这样可以轻松地向UI发布更新,或者您可以使用背景Service以及相关的通信(通过AIDL或更简单的消息和处理程序)。

答案 1 :(得分:2)

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

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