Android网络连接系列学习(一)

概要

     在SDK23出现之后,谷歌取消了对HttpClient的默认支持,但是我们仍然可以导入相关库来使用它。最近做项目发现自己对安卓的网络请求方面还不是很了解,所以写一系列博客来学习一下,我也不知道这个系列会有多少分集,但是我相信我能写完的~

问题来源

     在做项目时遇到一个问题,就是我们写的网络程序在运行时没有问题,但是最小化到后台后,运行其他网络程序,比如看一会儿腾讯新闻再回到我们的程序时会发生崩溃现象,崩溃的错误提示如下
    
java.lang.RuntimeException: An error occured while executing doInBackground()
05-04 10:34:10.073 27124-31411/? E/catch error::     at android.os.AsyncTask$3.done(AsyncTask.java:300)
05-04 10:34:10.073 27124-31411/? E/catch error::     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
05-04 10:34:10.073 27124-31411/? E/catch error::     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
05-04 10:34:10.073 27124-31411/? E/catch error::     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
05-04 10:34:10.073 27124-31411/? E/catch error::     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-04 10:34:10.073 27124-31411/? E/catch error::     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
05-04 10:34:10.073 27124-31411/? E/catch error::     at java.lang.Thread.run(Thread.java:841)
05-04 10:34:10.073 27124-31411/? E/catch error:: Caused by: java.lang.NullPointerException
05-04 10:34:10.073 27124-31411/? E/catch error::     at com.icephone.Utlts.NetWorkUtils.getStrFromUrl(NetWorkUtils.java:402)
05-04 10:34:10.073 27124-31411/? E/catch error::     at com.icephone.Utlts.NetWorkUtils.getStrFromUrl(NetWorkUtils.java:383)
05-04 10:34:10.073 27124-31411/? E/catch error::     at com.icephone.fragment.NewHomeFragment$NetGetBannerPicTask.doInBackground(NewHomeFragment.java:1208)
05-04 10:34:10.073 27124-31411/? E/catch error::     at com.icephone.fragment.NewHomeFragment$NetGetBannerPicTask.doInBackground(NewHomeFragment.java:1202)
05-04 10:34:10.073 27124-31411/? E/catch error::     at android.os.AsyncTask$2.call(AsyncTask.java:288)
05-04 10:34:10.073 27124-31411/? E/catch error::     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-04 10:34:10.073 27124-31411/? E/catch error:: 	... 3 more

Android网络连接系列学习(一)_第1张图片

错误代码为:

HttpResponse httpResponse = NetWorkUtils.httpClient.execute(httpGet);

问题分析与解决

//为了方便大家解决相似的问题,此篇博文会持续更新,直到问题解决,相关较全面的知识点会在本系列的其他博文解决,这里用到时则只会引用自己的博文

//如果您只想直到此类问题如何解决,请看后文的" 问题解决!!“ 标题,希望对您有帮助

首先,我们先来分析一下错误报告:
                       首先
An error occured while executing doInBackground()
说明我们的异步任务类在进行网络处理时抛出了一个异常,但是由于异常已经抛出,故我们应该向后看
Caused by: java.lang.NullPointerException
好吧,相信写程序的猿们已经对这句话不陌生了=w=,十个问题有九个半是他的锅
try {
                resStr = NetWorkUtils.getStrFromUrl(String.format(NetWorkUtils.GET_LAST_BUILDING_DYNAMIC, cityId , regionId));
            } catch (SocketTimeoutException e) {
                e.printStackTrace();
                return null;
            }
这里是在异步网络任务里写的网络请求判断,我们已经对resStr做了相应的处理,当网络请求超时时我们就认为网络请求失败返回空值并在execute里执行相应的判断。但是经过排查发现,这里的return null未必会被执行,因为网络连接失败可能不只是这一个exception引起的,比如可能还有 NoHttpResponseException 等很多异常可能,所以我们可以在try后面追加一个判断:
if(resStr == null)
            {
                return null;
            }

后来我发现这是不行的,崩溃了没有捕捉到根本轮不到这句话好吗= =,自己真实蠢爆了,还是直接catch Exception e 吧!

或者直接catch exception ,但是不推荐这种做法= =其实我感觉两种做法都一样的,解决方法不是很好,但是可以解决

问题解决!!

首先查看一下网络请求时是否进行了try …catch 处理,如果进行的话判断catch的内容是否全面,如果以上条件都满足了,判断自己的网络判空处理是否有效,祝君好运
     =w=    愿世界永无bug

总结

1、永远不要相信你的try catch(除非无脑exception e)
2、在网络请求是再小心也不为过(检查网络请求是否在异步任务或线程里执行,是否进行过异常判断处理,是否在handler里更新界面,是否正确解析json,是否对所获得的数据进行了全面的处理){ 一般也就这些问题  }

最后,上一个图(反正我是躺枪了- =)


Android网络连接系列学习(一)_第2张图片
 


你可能感兴趣的:(httpclient,Android开发,网络)