是时候干掉onActivityResult了

两个冤家,handler与onActivityResult

安卓中有两个我们常用,但写起来非常不爽的代码。一个是handler,另一个就是onActivityResult了。他们非得让我们都整一个常量,而且看代码时请求和处理逻辑之间跳来跳去。有句名言叫:写给机器理解的代码渣渣都行,真正牛的是写得普通人人理解的。
我们知道handler大部分用在网络请求上,至于去掉可以看我以前的文章安卓项目易用Ohttp封装,当然这个网络请求封装很多。但对onActivityResult封装的并不多。

要实现的目标代码

这里我要说下,当我们想实现一个东西时。不是先想怎么实现,而是先想我们要实现什么样的,首先我们不要requestCode,其次我们要回调:

 startActivityForResult(new Intent(this, MainActivity.class), new ResultBack() {
            @Override
            public void resultOk(Intent data) {
                //to do what you want when resultCode == RESULT_OK
            }
        });

实现分析

1.有人说使用进程注入的方式hook系统的activity数据发送,这个不好实现,也不建议这样。
2.使用代理的Activity或fragment,如果使用单例,就需要解决不同activity回调的生命周期,而使用每个新建一个的话,每个请求new一个activity或fragment对象开销太大。
3.进行简单封装,跟随调用对象的生命周期,这个简单,而且易于使用和理解。

实现代码

首先我们看到上面有个回调接口,只写了成功的部分,有同学就问,你这我怎么处理失败或其他自定义的resultCode,看代码:

public abstract class ResultBack {
    public abstract void resultOk(Intent data);
    public void resultElse(int resultCode, Intent data){
    //可以吧,如果要处理其他情况只需重写此方法。大部分时候我们是不需要的,故写成空方法。
    }
}

简单封装

重点来了,我们是怎么干掉requestCode的呢?说简单也简单,相信你一看就懂。只需在基类BaseActivity加上下面这些代码就行了。什么,Fragment怎么办?直接getActivity转成BaseActivity调用它就行了。

private ArrayList<ResultBack> list = new ArrayList<>();//保存所有activity返回的回调,跟随activity生命周期

public synchronized void startActivityForResult(Intent intent, ResultBack resultBack) {
     if (list.indexOf(resultBack) < 0) {
         list.add(resultBack);
         startActivityForResult(intent, list.size() - 1);//requestCode就是list的Index,哈哈哈
     }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
         list.get(requestCode).resultOk(data);
    } else {
        list.get(requestCode).resultElse(resultCode, data);
    }
    list.set(requestCode, null);//释放已返回的ResultBack,不用remove防止乱序
}

好了 只要把这点代码拷过去,你就不用每次写个常量int值了和跳来跳去看代码了。

猜你喜欢

转载自blog.csdn.net/wanyouzhi/article/details/78533888