2017-11-23 11:32:49 congdunie0195 阅读数 4
  • Dubbo开发框架

    Dubbo是阿里巴巴推出的一款流行的RPC开发框架,利用Dubbo可以更加方便的实现远程业务中心的定义,以方便集群化项目的编写。 Dubbo的开发不单单是一个开发框架的问题,而是需要许多与之相对应的技术,首先你应该熟练掌握Linux系统的基本操作、而后还需要掌握ZooKeeper组件、Eclipse开发工具、Maven构建工具的使用。

    6534 人正在学习 去看看 李兴华
开发语言: java、ios、android

部署平台: linux、window

jdk版本:JDK1.7以上版本

开发工具: eclipse、idea等

服务器中间件:Tomcat 6、7、Jboss 7、WebLogic 10、WebSphere 8

框架支持: springmvc、mybatis、shiro、restful、redis、sso单点登录

通用管理: 用户管理、角色管理、权限管理、动态菜单、数据字典管理、机构管理、区域管理、日志管理、日志监控、代码生成工具。

1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。 

2.机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。
 
3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。 

4.菜单管理:配置系统菜单,操作权限,按钮权限标识等。 

5.角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 

技术选型: 

1、后端
        服务框架:Rest服务、缓存:Redis

        负载均衡:Nginx、数据库连接池:Alibaba Druid 1.0

        核心框架:Spring framework、安全框架:Apache Shiro 1.2

        视图框架:Spring MVC 4.0、服务端验证:Hibernate Validator 5.1

        持久层框架:MyBatis 3.2、日志管理:SLF4J 1.7、Log4j

        工具类:Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI

2、前端
        JS框架:JQuery 1.9、CSS框架: Bootstrap 4

        客户端验证:JQuery Validation Plugin、富文本:CKEcitor

        文件管理:CKFinder、动态页签:Jerichotab

        数据表格:jqGrid、对话框:jQuery jBox、树结构控件:jQuery zTree

功能截图:


资料和源码来源

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31492842/viewspace-2147655/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/31492842/viewspace-2147655/

2017-07-10 17:52:39 SiwenYY 阅读数 1091
  • Dubbo开发框架

    Dubbo是阿里巴巴推出的一款流行的RPC开发框架,利用Dubbo可以更加方便的实现远程业务中心的定义,以方便集群化项目的编写。 Dubbo的开发不单单是一个开发框架的问题,而是需要许多与之相对应的技术,首先你应该熟练掌握Linux系统的基本操作、而后还需要掌握ZooKeeper组件、Eclipse开发工具、Maven构建工具的使用。

    6534 人正在学习 去看看 李兴华
趁着这段时间不忙,放下工作,静下心来对Android中常用的第三方框架进行了剖析并整理,接下来从网络请求框架开始。

常用网络请求框架对比:

1.okhttp

okhttp和HttpClient、HttpURLConnection或Apache的HttpClient是同等级别的,他们是网络客户端,不仅Android能用,Java也能用,所以在android中想要用要进行封装以提供简单的API使用。

Square 公司开源的 okHttp 是一个专注于连接效率的 HTTP 客户端。okHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。默认情况下,okHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。从Android4.4开始HttpURLConnection的底层实现采用的是okHttp.

okHttp,okHttpUtils,Retrofit(三者都是基于okhttp实现的,okHttpUtils是鸿洋大神对okhttp的封装,Retrofit是OkHttp母公司出品的)

优点

支持http请求,https请求。
支持文件下载。
使用的是HttpURLConnection,不要担心android版本的变换。(至少目前是都支持的)。
支持get,post请求。
基于Http的文件上传。
加载图片。

缺点

比如callback回来是在线程里面, 不能刷新UI,需要我们手动处理。
封装比较麻烦。

2、Volley

   是Google在2013年Google I/O大会上基于HttpClient + HttpURLConnection来封装的,针对短、频、快的网络请求推出的一款新的网络通信框架,开源的。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。Volley 的特点:特别适合数据量小,通信频繁的网络操作。

优点

非常适合进行数据量不大,但通信频繁的网络操作。
内部分装了异步线程。
支持get,post网络请求。
图片下载。
可直接在主线程调用服务端并处理返回结果。
可以取消请求,容易扩展,面向接口编程。

缺点

对大文件下载 Volley的表现非常糟糕。
只支持http请求。
图片加载性能一般。
使用的是httpclient,HttpURLConnection。不过在android 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar。

使用方法:

1. 创建一个RequestQueue对象。
2. 创建一个StringRequest对象。
3. 将StringRequest对象添加到RequestQueue里面。
RequestQueue mQueue = Volley.newRequestQueue(context);  
StringRequest stringRequest = new StringRequest("http://www.baidu.com",  
                        new Response.Listener<String>() {  
                            @Override  
                            public void onResponse(String response) {  
                                Log.d("TAG", response);  
                            }  
                        }, new Response.ErrorListener() {  
                            @Override  
                            public void onErrorResponse(VolleyError error) {  
                                Log.e("TAG", error.getMessage(), error);  
                            }  
                        }); 
mQueue.add(stringRequest); 

详细使用参考鸿洋的博客:http://blog.csdn.net/guolin_blog/article/details/17482095/


3、NoHttp

是基于HttpURLConnection来封装的,它的优势在于封装的功能强大,性能也可以。简述如下:

(1)支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载,断点续传。
(2)支持304缓存,302/303重定向,支持通过代理服务器访问地址。
(3)NoHttp是队列,自动为请求排队,可以取消指定请求,可以取消队列所有请求,亦可以停止队列。
(4)支持请求String、Bitmap、JsonObject、可自定义扩展请求类型(demo中的FastJsonRequest等)
(5)API使用简单,Request对象包涵参数、文件、请求头等;Response对象包涵响应内容, 响应头等信息。

总结:

(1)如果你的应用场景是频繁短暂的网络交互不涉及大文件的上传、下载 Volley足可以满足需求,apk的升级下载要自行封装一下;
(2)如果你想更省事、更简单的开发可以使用NoHttp,不过NoHttp是个人开发的,后期的维护升级是有风险的;
(3)如果想要稳定并且高效的一款网络框架,OkHttp是首选,花点时间找一个封装好的框架或者自己封装一下想要的功能就可以了。

4、xUtils(跟Afinal是同类型的框架, 现在作者已经两三年前就没有进行更新了)

xUtils 包含了很多实用的android工具。xUtils 源于Afinal框架,对Afinal进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有更加灵活的ORM,更多的事件注解支持且不受混淆影响。同时需要注意的是,xUitls最低兼容android 2.2 (api level 8)  。
一、ViewUtils
@ViewInject、@OnClick,就能轻松摆脱findViewById找控件,各种监听事件的绑定。

二、HttpUtils
支持的HTTP七种请求方式,非常便捷的满足你的接口请求的需要。同时还支持大文件上传下载,以及同步异步请求。

三、BitmapUtils
摆脱了程序因OOM强制关闭和加在网络图片的问题。

四、DbUtils
简单易用又出色的ORM(对象关系映射:Object-Relational Mapping)框架,直接轻松存储各种对象到sqlite数据库中,同时也能非常方便的进行各种条件查询,甚至分页查询,还有对表中数据的更新删除等操作,真正的实现。一行代码就可以进行增删改查。并且可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等,支持事务。

官网的简介:
xUtils3 api 变化较多, 已转至 https://github.com/wyouflf/xUtils3
xUtils 2.x 对 Android 6.0兼容不是很好, 请尽快升级至 xUtils3.
xUtils 包含了很多实用的android工具。
xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵活的 ORM,更多的事件注解支持且不受混淆影响…
xUitls 最低兼容android 2.2 (api level 8)
官网或相关地址:
Afinal框架 的 github 地址:https://github.com/wyouflf/xUtils
注:这个框架的作者已经停止更新了,因此现在就不推荐使用了


5、Afinal框架

Afinal 是一个 android 的 sqlite orm 和 ioc 框架。同时封装了android中的http框架,使其更加简单易用;使用 finalBitmap,无需考虑 bitmap 在 android 中加载的时候 oom 的问题和快速滑动的时候图片加载位置错位等问题。
Afinal的宗旨是简洁,快速。约定大于配置的方式。尽量一行代码完成所有事情。

Afinal主要是分四个模块: 
(1) 数据库模块:android 中的 orm 框架,使用了线程池对 sqlite 进行操作。 
(2) 注解模块:android 中的 ioc 框架,完全注解方式就可以进行UI绑定和事件绑定。无需 findViewById 和 setClickListener 等。其实它后面是使用反射来进行初始化的。 
(3) 网络模块:通过 httpclient 进行封装 http 数据请求,支持 ajax方式加载,支持下载、上传文件功能。 
(4) 图片缓存模块:通过 FinalBitmap,imageview 加载 bitmap 的时候无需考虑 bitmap 加载过程中出现的 oom 和 android 容器快速滑动时候出现的图片错位等现象。

官网或相关地址:
Afinal框架 的 github 地址:https://github.com/yangfuhai/afinal
注:这个框架的作者已经停止更新了,因此现在就不推荐使用了


以上是常用的网络框架,项目中比较熟悉和常使用的框架:基于okHttp封装库的okhttputils框架(详细使用参考网络请求框架(二)—-改善的okHttp封装库okhttputils的使用 )和volley框架。

2018-08-19 21:31:18 Jsagacity 阅读数 555
  • Dubbo开发框架

    Dubbo是阿里巴巴推出的一款流行的RPC开发框架,利用Dubbo可以更加方便的实现远程业务中心的定义,以方便集群化项目的编写。 Dubbo的开发不单单是一个开发框架的问题,而是需要许多与之相对应的技术,首先你应该熟练掌握Linux系统的基本操作、而后还需要掌握ZooKeeper组件、Eclipse开发工具、Maven构建工具的使用。

    6534 人正在学习 去看看 李兴华

在Android开发中,网络请求是非常常用的。而Retrofit这个开源库是当下最火的网络请求库。下面是Retrofit的简介:

还有就是在Android中,有一个主线程,只有在此线程中才可以更新UI,而网络请求是耗时,为了提高用户体验,就规定耗时的操作基本都得放在子线程中。以往我们网络请求完之后是通过Handler、AsyncTask和runOnUiThread。在面试中前两个也是面试的重中之重来的,经常会被问到的。

而现在最火的一个异步库就是Rxjava了,它利用观察者模式很好的解决了子线程与主线程之间的通信。即使业务逻辑复杂起来,它依旧可以做到简洁明了。
如果想要详细了解Rxjava,这里有一篇介绍的蛮详细的:给 Android 开发者的 RxJava 详解

接下来正式使用Retrofit和Rxjava写一个简单的登陆Demo。我在本地简单的写了一个登录响应,返回的json数据是:
这里写图片描述

准备好之后就新建一个Android项目,先添加一下所需的依赖:

//retrofit2
    implementation 'com.google.code.gson:gson:2.8.1'
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.okhttp3:okhttp:3.8.1'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1'

//rxjava2
    implementation 'io.reactivex.rxjava2:rxjava:2.1.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'

//配合Rxjava2 使用
    implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

完了点击刷新,添加一个json数据的实体类:

public class UserInfoModel {

    public int code;
    public UserInfo data;
    public String message;

    public static class UserInfo{
        public int id;
        public String username;
        public String email;
        public String tel;
    }

    @Override
    public String toString() {
        return "UserInfoModel{" +
                "code=" + code +
                "\n, data{ id=" + data.id +
                "\n, username=" + data.username +
                "\n, email=" + data.email +
                "\n, tel=" + data.tel +
                "},\n message='" + message + '}';
    }
}

再添加一个service,里面是请求时用到的方法:

public interface UserMsgService {

    /**
     * 请求登陆的方法,需要两个参数,用的是POST方式
     *
     * @param username 用户名
     * @param password 密码
     * @return
     */
    @POST("BackStageSystem/servlet/LoginServlet")
    Observable<UserInfoModel> login(@Query("username") String username, @Query("password") String password);
}

最后就在Activity里面进行简单的请求:

public class MainActivity extends AppCompatActivity {
    private static final String BASE_URL = "http://192.168.6.109:8080/";
    private TextView tv_content;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_content = findViewById(R.id.tv_content);
    }

    public void onAction(View view) {


        //创建Retrofit对象
        Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        //获取UserMsgService对象
        UserMsgService userMsgService = retrofit.create(UserMsgService.class);

        userMsgService.login("zhangsan", "123456")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<UserInfoModel>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(UserInfoModel userInfoModel) {
                        tv_content.setText(userInfoModel.toString());
                    }

                    @Override
                    public void onError(Throwable e) {
                        //请求失败的情况
                    }

                    @Override
                    public void onComplete() {

                    }
                });

    }
}

布局文件就是一个按钮和显示文本,非常的简单明了。

运行一下查看一下结果:
这里写图片描述

以上只是简单的使用,Retrofit和Rxjava还有很多很高深的用法,之后再深入研究。

2019-09-24 16:15:42 qq_39629277 阅读数 188
  • Dubbo开发框架

    Dubbo是阿里巴巴推出的一款流行的RPC开发框架,利用Dubbo可以更加方便的实现远程业务中心的定义,以方便集群化项目的编写。 Dubbo的开发不单单是一个开发框架的问题,而是需要许多与之相对应的技术,首先你应该熟练掌握Linux系统的基本操作、而后还需要掌握ZooKeeper组件、Eclipse开发工具、Maven构建工具的使用。

    6534 人正在学习 去看看 李兴华

1.集成jdk
方式一:本地下载,下载服务端SDK开发工具包,下载地址为:http://www.getui.com/download/docs/getui/server/GETUI_JAVA_SDK_4.1.0.5.zip
方式二:上传jar包到私库,项目引用依赖。

2.编写工具类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.xxx.push.dubbo.util;

import com.alibaba.fastjson.JSONObject;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.SingleMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.base.payload.APNPayload;
import com.gexin.rp.sdk.exceptions.RequestException;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.TransmissionTemplate;

import com.gexin.rp.sdk.template.style.Style0;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;


/**
 * 个推推送工具类
 *
 * @author lxp
 * @date 2019 -09-16 10:56:04
 */
@Slf4j
public class GeTuiUtil {
    //定义常量, appId、appKey、masterSecret 采用本文档 "第二步 获取访问凭证 "中获得的应用配置
    private static String appId = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
    private static String appKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    private static String masterSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
	(具体appId、appKey、masterSecret,在个推官网 )

    /**
     * 单个用户android推送
     *
     * @param cid
     * @param msg
     * @return
     * @author lxp
     * @date 2019 -09-18 09:25:51
     */
    public static boolean sendMessageAndroid(String cid, String msg) {
        IGtPush push = new IGtPush(appKey, masterSecret);
        TransmissionTemplate template = new TransmissionTemplate();
        template.setAppId(appId);
        template.setAppkey(appKey);
        template.setTransmissionType(2);
        template.setTransmissionContent(msg);

        // STEP2:设置通知样式
        //Style0 style = new Style0();
        // 设置通知栏标题与内容
        //style.setTitle("系统消息");
        //style.setText(msg);
        // 设置
        //template.setStyle(style);


        SingleMessage message = new SingleMessage();
        message.setOffline(true);
        // 离线有效时间,单位为毫秒,可选
        message.setOfflineExpireTime(24 * 3600 * 1000);
        message.setData(template);
        // 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发
        message.setPushNetWorkType(0);
        Target target = new Target();
        target.setAppId(appId);
        target.setClientId(cid);
        IPushResult ret = null;
        try {
            ret = push.pushMessageToSingle(message, target);
        } catch (RequestException e) {
            e.printStackTrace();
            ret = push.pushMessageToSingle(message, target, e.getRequestId());
        }
        if (ret != null && ret.getResponse() != null && ret.getResponse().containsKey("result")) {
            log.info(ret.getResponse().toString());
            if(ret.getResponse().get("result").toString().equals("ok") && ret.getResponse().containsKey("status")){
                return true;
            }
        }
        return false;
    }

    /**
     * 单个用户ios推送
     *
     * @param
     * @return
     */
    public static String sendMessageIos(String cId, String msg) {
        IGtPush push = new IGtPush(appKey, masterSecret);

        TransmissionTemplate template = new TransmissionTemplate();
        template.setAppId(appId);
        template.setAppkey(appKey);
        template.setTransmissionContent(msg);
        // 透传消息设置,1为强制启动应用,客户端接收到消息后就会立即启动应用;2为等待应用启动
        template.setTransmissionType(2);
        //设置ios
        template.setAPNInfo(getAPNPayload(msg));

        SingleMessage message = new SingleMessage();
        message.setData(template);
        message.setOffline(true);
        //离线有效时间,单位为毫秒,可选
        message.setOfflineExpireTime(24 * 1000 * 3600);
        // 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发
        message.setPushNetWorkType(0);

        Target target = new Target();
        target.setAppId(appId);
        target.setClientId(cId);
        IPushResult ret = null;
        try {
            ret = push.pushMessageToSingle(message, target);
        } catch (RequestException e) {
            e.printStackTrace();
            ret = push.pushMessageToSingle(message, target, e.getRequestId());
        }
        if (ret != null) {
            return ret.getResponse().toString();
        } else {
            log.error("【IOS】个推,服务器异常");
            return "";
        }
    }

    private static APNPayload getAPNPayload(String msg) {
        //封装透传内容
        Map<String, Object> map= (Map<String, Object>) JSONObject.parse(msg);

        APNPayload payload = new APNPayload();
        //在已有数字基础上加1显示,设置为-1时,在已有数字上减1显示,设置为数字时,显示指定数字(设置角标)
        payload.setAutoBadge(String.valueOf(map.get("count")));
        payload.setContentAvailable(1);

        //简单模式APNPayload.SimpleMsg
        //payload.setAlertMsg(new APNPayload.SimpleAlertMsg(msg));
        //字典模式使用下者
        String body = (String) map.get("message");
        payload.setAlertMsg(getDictionaryAlertMsg(body));
        //添加附加信息
        payload.addCustomMsg("message",msg);
        return payload;
    }

    private static APNPayload.DictionaryAlertMsg getDictionaryAlertMsg(String body) {
        APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();
        // iOS8.2以上版本支持
        alertMsg.setTitle("系统消息");

        alertMsg.setBody(body);
        return alertMsg;
    }
}

2015-11-09 16:15:36 liudb5 阅读数 4846
  • Dubbo开发框架

    Dubbo是阿里巴巴推出的一款流行的RPC开发框架,利用Dubbo可以更加方便的实现远程业务中心的定义,以方便集群化项目的编写。 Dubbo的开发不单单是一个开发框架的问题,而是需要许多与之相对应的技术,首先你应该熟练掌握Linux系统的基本操作、而后还需要掌握ZooKeeper组件、Eclipse开发工具、Maven构建工具的使用。

    6534 人正在学习 去看看 李兴华

        在android开发中会遇到各种SDK的接入,很是麻烦。最初在想能不能把所有的SDK都融合到一个当中,发现有点异想天开。但是也可以解决SDK资源不小心没有引入,导致程序调用接口崩溃问题。经过查资料,还是写了一个小Demo,仅供参考!很早之前写的了,估计移动基地SDK,有变动,不过道理是一样的。

        仅以移动基地SDK举例。

1.移动支付需要的SO文件导入。

public class CarrotApplication extends Application {
	//是否含有移动支付SDK
	boolean useCMBilling = false;
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		try {
            Class.forName("cn.cmgame.billing.api.GameInterface");
            useCMBilling = true;
        } catch (ClassNotFoundException ignored) {

        }
		if(useCMBilling){
			System.loadLibrary("megjb");
		}
	}
}

2.初始化移动基地支付
protected void init_cmcc(String app_name, String app_company,
			String telphone_number) {
		try {
			Object [] cmcc_init_obj = {CarrotPaySDK.mContext,app_name,app_company,telphone_number};
			Class<?> [] classparam = {Activity.class,String.class,String.class,String.class};
			cfcaim.invokeStaticMethod("cn.cmgame.billing.api.GameInterface","initializeApp",cmcc_init_obj,classparam);
		} catch (Exception e) {
			// TODO: handle exception
			Log.e("init_cmcc异常捕捉", "异常:"+e.toString());
		}
	}

3.上面 invokeStaticMethod 的实现

/**
	 * 执行某个类的静态方法
	 * @param	className		类名
	 * @param	methodName		方法名
	 * @param	oArray			方法参数
	 * @param	paramTypeArray		构造参数类型
	 * @author liudb
	 * */
	public Object invokeStaticMethod(String className, String methodName,
			Object[] oArray,Class<?> [] paramTypeArray) throws Exception {
		Class<?> ownerClass = Class.forName(className);
		Method method = ownerClass.getMethod(methodName, paramTypeArray);
		return method.invoke(ownerClass, oArray);
	}

4.调用支付接口

/**
	 * 执行移动支付
	 * @param		isUsesim		sim卡是否可用
	 * @param		isRepeat		计费点是否可重复
	 * @param		index			计费点编号
	 * @param		order			订单号
	 * @param 		callback		支付回调
	 */
	protected void cmcc_pay(boolean isUsesim,boolean isRepeat,String index,String order,final CarrotPayCallBack callback){
		try {
			//这里的 callback  是自定义的回调函数,会在步骤7里介绍
                        cmcc_PayendHandler = new CarrotHandler(CarrotPaySDK.mContext){
				@Override
				public void handleMessage(Message msg) {
					// TODO Auto-generated method stub
					super.handleMessage(msg);
                                        //这里处理返回结果
                                        callback.onPayEnd(msg.what);
				}
			};
			// 传入参数
			Object [] cmcc_pay_param = {CarrotPaySDK.mContext,isUsesim,isRepeat,index,order,new Object()};
			// 参数对应的TYPE
			Class<?> [] cmcc_pay_paramtyp = {Context.class,boolean.class,boolean.class,String.class,String.class,Object.class};
			// "IPayCallback" 是移动支付的回调函数名
			cfcaim.invokeContainsInterfaceStaticMethod("cn.cmgame.billing.api.GameInterface", "doBilling", cmcc_pay_param,cmcc_pay_paramtyp,"IPayCallback",CarrotPaySdkFinal.CMCC_PAY);
		} catch (Exception e) {
			// TODO: handle exception
			Log.e("cmcc_pay异常捕捉", "异常:"+e.toString());
		}
	}

5.重点就是上面 invokeContainsInterfaceStaticMethod 方法的实现

/**
	 * 执行包含接口的静态方法
	 * @param	className		类名
	 * @param	methodName		方法名
	 * @param	oArray			具体参数
	 * @param	paramTypeArray		构造参数类型
	 * @param	interfaceName	接口名
	 * @author liudb
	 * */
	public Object invokeContainsInterfaceStaticMethod(String className, String methodName,
			Object[] oArray,Class<?> [] paramTypeArray,String interfaceName,CarrotPaySdkFinal payType) throws Exception {
		Class<?> ownerClass = Class.forName(className);

		Class<?>[] argsClass = new Class[oArray.length];
		Method [] ms = ownerClass.getDeclaredMethods();
		for (int i = 0, j = oArray.length; i < j; i++) {
			argsClass[i] = oArray[i].getClass();
		}
		Method method = findMethod(ms, methodName, paramTypeArray, interfaceName);
		Class<?> clazz = Class.forName(othre_callBack.getName());
		//因为接口的最后一个参数是回调函数,所以要设置监测回调
		oArray[oArray.length -1] = Proxy.newProxyInstance(
	            clazz.getClassLoader(),
	            new Class[]{clazz},
	            new CarrotPayCallbackMethodInterceptor(payType));
		othre_callBack = null;
		return method.invoke(ownerClass, oArray);
	}

6.还有如何捕获回调的接口返回的参数 CarrotPayCallbackMethodInterceptor 类的实现

public class CarrotPayCallbackMethodInterceptor implements InvocationHandler {
	CarrotPaySdkFinal csf;
	public CarrotPayCallbackMethodInterceptor (CarrotPaySdkFinal paytype){
		csf = paytype;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		switch (csf) {
		case CMCC_PAY:
                //在这里获得回调函数返回的参数,通过自定义carrotSdkHelper发送给callback处理返回结果
                          for(int j = 0; j < args.length;j++){
				if(args[j].getClass().getName().equalsIgnoreCase("java.lang.Integer")){
					Integer result = (Integer)args[j];
					switch (result) {
					case 1:
						Message msg_cmcc_success = new Message();
						msg_cmcc_success.what = CarrotPaySDK.CARROT_PAY_SUCCESS;
						CarrotPaySDK.carrotSdkHleper.cmcc_PayendHandler.sendMessage(msg_cmcc_success);
						break;
					case 2:
						Message msg_cmcc_faild = new Message();
						msg_cmcc_faild.what = CarrotPaySDK.CARROT_PAY_FAILD;
						CarrotPaySDK.carrotSdkHleper.cmcc_PayendHandler.sendMessage(msg_cmcc_faild);
						break;
					default:
						Message msg_cmcc_faild2 = new Message();
						msg_cmcc_faild2.what = CarrotPaySDK.CARROT_PAY_FAILD;
						CarrotPaySDK.carrotSdkHleper.cmcc_PayendHandler.sendMessage(msg_cmcc_faild2);
						break;
					}
				}
			}
			break;
		case OTHER_PAY:
			Log.e("___________OTHER_______________", "____________________"+method.getName());
			
			for(int j = 0; j < args.length;j++){
				Log.e("___________OTHER_______________"+args[j].getClass().getName(), "____________________"+args[j].toString());
				
			}
			Log.e("___________OTHER_______________", "______333333______________");
			break;
		default:
			break;
		}
		
        return null;  
	}

}

7.(1)callback 类的介绍

public interface CarrotPayCallBack {  
	    public void onPayEnd(int isSuccess);  
	} 
(2)具体实现新建一个CarrotPayCallBack,传到4步骤的方法里

new CarrotPayCallBack() {
				
				@Override
				public void onPayEnd(int isSuccess) {
					// TODO Auto-generated method stub
					switch (isSuccess) {
					case CarrotPaySDK.CARROT_PAY_SUCCESS:
						Toast.makeText(getApplicationContext(), "支付成功", Toast.LENGTH_SHORT).show();
						break;
					case CarrotPaySDK.CARROT_PAY_CANCEL:
						Toast.makeText(getApplicationContext(), "支付取消", Toast.LENGTH_SHORT).show();
						break;
					case CarrotPaySDK.CARROT_PAY_FAILD:
						Toast.makeText(getApplicationContext(), "支付失败", Toast.LENGTH_SHORT).show();
						break;
					case CarrotPaySDK.CARROT_PAY_UNKNOW:
						Toast.makeText(getApplicationContext(), "未知错误", Toast.LENGTH_SHORT).show();
						break;
					default:
						break;
					}
				}
			}

8.代码已经提交到github,如有需要请移驾点击打开链接

没有更多推荐了,返回首页