问题描述
- Android 开发中,访问网络的问题
-
public class MainActivity extends Activity { private EditText address; private Button getbutton; private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { //版本4.0后需加这个,不然就报错android.os.NetworkOnMainThreadException StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().detectLeakedClosableObjects() .penaltyLog().penaltyDeath().build()); // super.onCreate(savedInstanceState); setContentView(R.layout.test); //初始化 address = (EditText) findViewById(R.id.address); getbutton = (Button) findViewById(R.id.getbutton); text = (TextView) findViewById(R.id.text); getbutton.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String url = address.getText().toString(); getPDAServerData(url); } }); } public void getPDAServerData(String url) { HttpClient client = new DefaultHttpClient(); HttpPost request; try { request = new HttpPost(url); //调用HttpClient对象的execute(HttpUriRequest request)发送请求,返回一个HttpResponse HttpResponse response = client.execute(request); //返回响应码为200 if (response.getStatusLine().getStatusCode() == 200) { //从响应中获取消息实体 HttpEntity entity = response.getEntity(); if (entity != null) { String out = EntityUtils.toString(entity); text.setText(out); } } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
请问,
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().detectLeakedClosableObjects() .penaltyLog().penaltyDeath().build());
这段代码的意思是什么呢,为什么不加,就无法执行访问网络的代码语句呢。
解决方案
request = new HttpPost(url);
//调用HttpClient对象的execute(HttpUriRequest request)发送请求,返回一个HttpResponse
HttpResponse response = client.execute(request);
这部分是网络操作,必须在子线程执行,没有这段代码就会抛出android.os.NetworkOnMainThreadException;
而这个StrictMode主要是用来调试程序的,这段代码可以检测到android.os.NetworkOnMainThreadException
异常并发出警告 penaltyLog()表示将警告输出到LogCat。
StrictMode 用法:http://www.2cto.com/kf/201503/381354.html
解决方案二:
楼上正解,要用子线程,提醒一下,要加联网权限
解决方案三:
去看google的最新官方文档 你会找到 更多的东西 如果你下了的话 一般在你电脑的sdk下的这个目录sdk/docs/reference/classes.html
解决方案四:
- 访问网络等耗时操作不要在UI线程中,要另起线程进行操作。
- 访问网络权限不要忘了添加
- 网路请求结果回来之后,要通过handler来回到UI线程去操作UI
解决方案五:
也谢谢其他大神的精彩回答。
时间: 2025-01-21 11:25:09