Android中使用空白Fragment作为中间层的使用(未整理)

场景:

在日常开发中,常常遇到类似的场景:

  • 权限申请,使我们通常在两个地方做权限通过与未通过的判断
  • startActivityForResult来在两个页面间接收数据
  • 微信SDK的相关操作,通常在一个专门的页面接收微信返回的数据,然后再通过一些方式传递给自己需要的页面。

当以上某个场景多次出现时候,会使代码变的额外的难以维护。而通过空白Fragment作为中间层,使返回的结果统一在Fragment中进行处理,可以使代码做到较好的解耦,另外在使用包装类对Fragment进行处理后,可以做到在一个地方做到数据的请求和回调,而不用写到两个地方。

参考链接:

https://github.com/qinhaihang/BaseLib

该文章使用空白Fragment对微信登录进行封装和处理进行演示:

使用方式:

  WXApiHelp.getInstance().init(this).wxLogin(new RouterWXCallBack() {
                    @Override
                    public void callBack(Map<String, String> map) {
                      //请求结果
                    }
                });

源码:

RouterWXCallBack.java

/**
 * 微信SDK回调
 */
public interface RouterWXCallBack {
    void callBack(Map<String,String> callBack);
}

RouterFragment.java

public class RouterFragment extends Fragment implements QCObserver {
    private List<WXApiHelp.WXCallBack> mCallBacks = new ArrayList<>();
    private IWXAPI api;
    public RouterFragment() {
    }

    public static RouterFragment getInstance(){
        return new RouterFragment();
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        MsgMgr.getInstance().attach(this);
    }

    public void wxLogin(WXApiHelp.WXCallBack wxCallBack){
        mCallBacks.add(wxCallBack);
        if (null == api){
            api = WXAPIFactory.createWXAPI(getContext(), BuildConfig.WX_PAY_APPID, false);
            api.registerApp(BuildConfig.WX_PAY_APPID);
        }
        if (!api.isWXAppInstalled()){
            DqToast.showShort("您还未安装微信客户端!");
            return;
        }
        final SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "dqApp";
        api.sendReq(req);
    }
	
    //微信请求回的结果会返回到这里,使用方式可以参考EventBus
    @Override
    public void onMessage(String key, Object value) {
        DqLog.e("YM------------>收到回调返回状态:"+key);
        DqLog.e("YM------------>mCallBacks是否为null:"+mCallBacks.isEmpty());
        switch (key){
            case MsgType.WX_USER_INFO:
                //收到消息
                if (!mCallBacks.isEmpty()){
                    WXApiHelp.WXCallBack routerWXCallBack = mCallBacks.get(0);
                    routerWXCallBack.callBack(value.toString());
                    mCallBacks.clear();
                }
                break;
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        MsgMgr.getInstance().detach(this);
    }
}

WXApiHelp.java

public class WXApiHelp {
    private static final String REQUEST_CAPTURE = "request_capture";
    private WeakReference<FragmentActivity> mWeakActivityRef;
    private static WXApiHelp instance;

    public static WXApiHelp getInstance() {
        if (instance == null) {
            synchronized (WXApiHelp.class) {
                if (instance == null) {
                    instance = new WXApiHelp();
                }
            }
        }
        return instance;
    }

    public WXApiHelp init(FragmentActivity activity){
        mWeakActivityRef = new WeakReference<>(activity);
        return instance;
    }

    private RouterFragment getFragment(){

        FragmentManager manager = mWeakActivityRef.get().getSupportFragmentManager();
        RouterFragment fragment = (RouterFragment)manager.findFragmentByTag(REQUEST_CAPTURE);

        if(fragment == null){
            fragment = RouterFragment.getInstance();
            manager.beginTransaction()
                    .add(fragment,REQUEST_CAPTURE)
                    .commitAllowingStateLoss();
            manager.executePendingTransactions();
        }

        return fragment;
    }

    public void release(){

        if(mWeakActivityRef != null && mWeakActivityRef.get() != null){

            FragmentManager manager = mWeakActivityRef.get().getSupportFragmentManager();
            RouterFragment fragment = (RouterFragment)manager.findFragmentByTag(REQUEST_CAPTURE);

            if(fragment != null){
                fragment = RouterFragment.getInstance();
                manager.beginTransaction()
                        .remove(fragment)
                        .commitAllowingStateLoss();
                manager.executePendingTransactions();
            }
            instance = null;
            mWeakActivityRef.clear();

        }
    }

    public void wxLogin(RouterWXCallBack routerWXCallBack){
        getFragment().wxLogin(new WXCallBack() {
            @Override
            public void callBack(String callBack) {
                Map<String,String> map = new HashMap<>();
                try {
                    JSONObject jsonObject = new JSONObject(callBack);
                    Iterator<String> iterable = jsonObject.keys();
                    while (iterable.hasNext()){
                        String jsonKey = iterable.next();
                        String jsonValue = jsonObject.optString(jsonKey,"");
                        map.put(jsonKey,jsonValue);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                if (null != routerWXCallBack){
                    routerWXCallBack.callBack(map);
                }
            }
        });
    }

    public interface WXCallBack{
        void callBack(String callBack);
    }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值