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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!