2 qq 17333539 qq_17333539 于 2016.03.10 22:48 提问

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());
这段代码的意思是什么呢,为什么不加,就无法执行访问网络的代码语句呢。

5个回答

baidu_21234955
baidu_21234955   2016.03.10 23:06
已采纳

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

wen_wxpk
wen_wxpk   2016.03.11 08:12

楼上正解,要用子线程,提醒一下,要加联网权限

lxk_1993
lxk_1993   Rxr 2016.03.11 08:26

去看google的最新官方文档 你会找到 更多的东西 如果你下了的话 一般在你电脑的sdk下的这个目录sdk/docs/reference/classes.html

crazy1235
crazy1235   Ds   Rxr 2016.03.11 11:39
  1. 访问网络等耗时操作不要在UI线程中,要另起线程进行操作。
  2. 访问网络权限不要忘了添加
  3. 网路请求结果回来之后,要通过handler来回到UI线程去操作UI
qq_17333539
qq_17333539   2016.03.11 15:17

也谢谢其他大神的精彩回答。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
【Android开发】网络编程及Internet应用-使用HttpClient访问网络
前面介绍了使用java.net包中的HttpURLConnection类来访问网络,在一般情况下,如果只需要到某个简单页面提交请求并获取服务器的响应,完全可以使用该技术来实现。不过,对于比较复杂的联网操作,使用HttpURLConnection类就不一定能满足要求,这时,可以使用Apache组织提供的HttpClient项目来实现。在Android中,已经成功的集成了HttpClient,所以可以
解决在主线程不能访问网络的问题
在android4.0及以后版本的开发中,如果在android的主线程中进行网络访问,会报错。 解决该问题的方法: 1.在oncreate()方法中添加这段代码,即可在主线程中访问网络: if(Build.VERSION.SDK_INT >= 11) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder
Android使用HTTP协议访问网络和OkHttp发送HTTP请求
对于Android开发来说,我们只需要了解一些就足够了。它的工作原理很简单,就是客户端向服务器发送一条HTTP请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理就可以了。Android上发送HTTP请求一般有两种方式:HttpURLConnection 和 HttpClient。不过由于HttpClient存在API数量过多、扩展困难等缺点,Android团队越来...
【Android开发】网络编程及Internet应用-通过HTTP访问网络
通有线互联网一样,移动互联网也可以使用HTTP访问网络。在Android中,针对HTTP进行网络通信的方法主要有两种,一种是使用HttpURLConnection实现;另一种是使用HttpClient实现。下面分别进行介绍 1.使用HttpURLConnection访问网络 HttpURLConnection位于java.net包中,用于发送HTTP请求和获取HTTP响应。由于该类是抽
Android——子线程中访问网络数据问题
Service中开启子线程调用网络通信的解决方法
C#访问网络中的计算机
C#访问网络中的计算机。在开发中能访问网络中的打印机。和计算机。
Android关于网络访问app应用开发相关的异常总结
现在大多数软件都需要进行网络访问,比如 手游 浏览器 聊天工具 理财产品 头条 … 如果你开发的软件不支持网络访问,也就是单机版,用户自娱自乐类型。比如 闹钟 指南针 记事本 计算器 … 这些都是单机,用户实用的一些工具app,不支持多个用户都是访问,交流。这里说说设计网络访问的app,需要考虑的异常,错误总结。既然是需要网络访问,可能出现以下一些问题。 第一种:手机连接
AsyncHttpClient
轻松实现异步上传图片,异步访问网络取数据。解决android主线程不能访问网络的问题。
Android访问网络的常用方式:Handler、AsyncTask简单例子(服务器端+Android端)
首先应该明白两点: 1.Android不允许在主线程(对于android来说,主线程就是UI线程)中访问网络。 2.Android不允许在一个子线程中直接去更新主线程中的UI控件。 对于问题1,可能你会说,这还不好办吗?再开一个线程不就完了?是的,你很聪明,原理也很简单。 对于问题2,就需要用到线程间通信(IPC),Android很好的将其进行了封装,也就有了今天的Handler和Asyn
【Android入门】访问Internet权限
<br />Android新手写程序经常碰到的一个问题就是写了半天的一个APP,结果访问网络访问不了,检查LOG发现时Permission denied.其实这是因为忘记在Manifest.xml里加一句开放网络权限的语句。只需在androidmanifest.xml里加一行<br /><uses-permission android:name="android.permission.INTERNET"></uses-permission>  <br />就可以访问网络啦!<br />