android-Android 开发中,访问网络的问题

问题描述

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

解决方案四:

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

解决方案五:

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

时间: 2025-01-21 11:25:09

android-Android 开发中,访问网络的问题的相关文章

android开发-在Android开发中打开网络设置出错,点击后直接退出而不是打开网络设置 怎么会事啊

问题描述 在Android开发中打开网络设置出错,点击后直接退出而不是打开网络设置 怎么会事啊 private void showSetNetworkDialog() { AlertDialog.Builder builder = new Builder(this); builder.setTitle("设置网络"); builder.setMessage("网络错误请检查网络链接"); builder.setPositiveButton("设置网络&qu

Android应用开发中对Bitmap的内存优化

在Android应用里,最耗费内存的就是图片资源.而且在Android系统中,读取位图Bitmap时,分给虚拟机中的图片的堆栈大小只有8M,如果超出了,就会出现OutOfMemory异常.所以,对于图片的内存优化,是Android应用开发中比较重要的内容. 1) 要及时回收Bitmap的内存 Bitmap类有一个方法recycle(),从方法名可以看出意思是回收.这里就有疑问了,Android系统有自己的垃圾回收机制,可以不定期的回收掉不使用的内存空间,当然也包括Bitmap的空间.那为什么还需

我是学android 在studio中连接网络数据库

问题描述 我是学android 在studio中连接网络数据库 我刚入职三天,写注册功能,存新用户到数据库,公司PHP的哥们提供了一个网络数据库接口http://192.168.1.27/phpmyadmin/index.php,数据库名diancan, 表名members,账号和密码我也有,我怎么才能连接到这个数据库?求大神给出代码 感激不尽,不想失业 解决方案 这是phpadmin.不是数据库连接 昨天有个和你一样的人也要失业了,问了一样的问题,在姐姐的帮助下成功再就业. 解决方案二: 你不

Android应用开发中单元测试分析_Android

本文主要和大家分享如何在Android应用开发过程中如何进行单元测试,个人在做项目的过程中,觉得单元测试很有必要,以保证我们编写程序的正确性.下面我们先大概了解下单元测试,以及单元测试的作用.        单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单个程序.函数.过程等:对于面向对象编程,最小单元就是方法,包括基类(超类).抽象类.或者派生类(子类)中的方法.单元测试是由程序员自己来完成

如何解决android NDK开发中的NDK_PROJECT_PATH

问题描述 如何解决android NDK开发中的NDK_PROJECT_PATH 在编译的过程中会报出的错误,导致程序编译失败Android NDK: Could not find application project directory ! Android NDK: Please define the NDK_PROJECT_PATH variable to point to it. /Users/****/Downloads/android-ndk-r9c/build/core/build

app-关于android APP开发中SQLITE数据库的问题

问题描述 关于android APP开发中SQLITE数据库的问题 代码如下,首先请问我写的这段创建数据库的代码有没有错误?然后把这个类的文件放在哪里才对啊,目前程序一打开就是程序已经停止运行,APP的第一个ACTIVITY我设置的就是判断这个库中的某个表中有没有数据.我现在感觉就是程序打开,这个库还没有创建,是不存在的,所以运行不了.请大神指教下我.或者说怎么让APP一开始运行的第一步就是运行以下的代码来创建这个数据库.求指教. //数据库创建类 package com.captain.dao

Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化

  关于Android 游戏开发中 OnTouchEvent() 触屏事件的性能优化笔记! 原文地址:http://blog.csdn.net/xiaominghimi/archive/2011/01/10/6127578.aspx 先上一段代码大家来看一下: view plaincopy to clipboardprint? ·········10········20········30········40········50········60········70········80····

Android编程开发中ListView的常见用法分析_Android

本文实例讲述了Android编程开发中ListView的常见用法.分享给大家供大家参考,具体如下: 一.ListView的使用步骤 ListView的使用通常有以下三个要素: (1)ListView中每个条目的布局; (2)填充进入ListView中的内容; (3)将内容与页面进行整合的Adapter. 因此,使用ListView也通常有以下三个步骤: (1)创建ListView条目的布局文件(或使用Android SDK提供的布局); (2)创建填充进入ListView中的内容,如字符串.图片

Android 游戏开发中绘制游戏触摸轨迹的曲线图_Android

       本篇文章主要来讲解怎样绘制游戏触摸轨迹的曲线图.        我们在onTouchEvent方法中,可以获取到触摸屏幕时手指触摸点的x.y坐标,如何用这些点形成一条无规则轨迹并把这条无规则轨迹曲线显示在屏幕上就是本篇文章的主旨内容.        Android Path类        Android提供了一个Path类 , 顾名思义这个类可以设置曲线路径轨迹.任何无规则的曲线实际上都是由若干条线段组成,而线段的定义为两点之间最短的一条线.path类就 可以记录这两点之间的轨迹

java-在使用Android studio 开发中,需要运行的代码到底应该写在哪?

问题描述 在使用Android studio 开发中,需要运行的代码到底应该写在哪? 先在src底下创建java文件,然后在Mainactivity.java中的onCreate(Bundle)中调用 还是直接写到MainActivity.java中 还是直接写到SRC中就会自己运行了 实在没懂 求解 解决方案 看你打算怎么运行程序,是app还是service.不同类型的程序不一样的. 解决方案二: 在xml配置起动的activity.然后在oncreate开始执行第一段代码. 你应该看看and