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