Android仿人人客户端(v5(1)

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

完整开源地址:https://docs.qq.com/doc/DSkNLaERkbnFoS0ZF

转载请标明出处:http://blog.csdn.net/android_ls/article/details/8740447

声明:仿人人项目,所用所有图片资源都来源于官方人人android客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片。

上一篇聊到网络模块的架构,我后来思考了下,觉得有可以优化的地方。

一、先提出我后来思考的问题:

在AppBaseActivity(对Activity类的扩展)中,用变量mAsyncRequests存储当前activity所持有的所有网络请求,仔细阅读过上一篇博文源码的朋友,一定知道有两处中断当前Activity所持有的网络异步处理,分别是在activity暂停(回调方法onPause())和销毁(回调方法onDestroy())的时候。上一篇的处理方式,代码片段如下:


private void cancelRequest() {

		if (mAsyncRequests != null && mAsyncRequests.size() > 0) {

			for (AsyncBaseRequest request : mAsyncRequests) {

				HttpURLConnection conn = request.getRequestConn();

				if ( conn != null) {

					try {

						conn.disconnect();

						System.out.println("onDestroy disconnect URL: " + conn.getURL());

						mAsyncRequests.remove(request);

					} catch (UnsupportedOperationException e) {

						//do nothing .

					}

				}

			}

		}

	}

仔细阅读上面的代码片段,会发现只是断开了网络请求返回,之后就从当前Activity所持有的网络请求集合中移除了AsyncBaseRequest对象,经过实践就会发现,这种处理方式明显存在问题。中断网络异步请求时,会有以下几种场景:

1、在异步线程中,当前正在发生着通过HTTP协议获取服务器端返回的数据(InputStream),恰巧在这个时候调用请求中断异步处理,上一篇的处理方式能处理。

2、在异步线程中,当前正发生着网络请求的数据已返回,这时调用中断处理,也就是说后面的数据解析和刷新UI的事就不处理了,上一篇的处理方式不能满足需求。

3、在异步线程中,当前正发生着网络请求返回的数据已解析完,这时调用中断处理,也就是说后面让主线程刷新UI的事就不处理了,上一篇的处理方式不能满足需求。

4、在异步线程中,当前正在发生着。。。,这时调用中断处理,后面的。。。就不用处理了。(可以控制颗粒度精细点,呵呵)

二、对上面提出的问题,我的解决方案只考虑三种情况,在Activity中调用中断处理时,异步线程中的预处理方式。

1、在异步线程类(AsyncBaseRequest)中添加中断标识,代码如下:


  private boolean interrupted;



    public boolean isInterrupted() {

        return interrupted;

    }



    public void setInterrupted(boolean interrupted) {

        this.interrupted = interrupted;

    }

2、在异步线程类(AsyncBaseRequest)中的核心方法中添加预处理,代码如下:


  @Override

    public void run() {

        try {

            if (interrupted) {

                System.err.println("访问网络前中断业务处理线程(终止)");

                return;

            }

            

            mInStream = getRequestResult();

            if (mInStream != null) {

                if (interrupted) {

                    System.err.println("解析数据前中断业务处理线程(终止)");

                    return;

                }



                String result = new String(readInputStream(mInStream));

                Object obj = parseHandler.parse(result);



                if (interrupted) {

                    System.err.println("刷新UI前中断业务处理线程(终止)");

                    return;

                }



                requestCallback.onSuccess(obj);

            } else {

                System.out.println("get InputStream By HttpURLConnection return result is NULL.");

                requestCallback.onFail(Constant.NETWORK_REQUEST_RETUN_NULL); // 网络请求返回NULL

            }

        } catch (IOException e) {

            requestCallback.onFail(Constant.NETWORK_REQUEST_IOEXCEPTION_CODE); // IO异常标识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值