6

Android应用开发框架 KJFrameForAndroid

 3 years ago
source link: http://www.androidchina.net/1663.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

KJFrameForAndroid简介

KJFrameForAndroid 又叫KJLibrary,是一个Android的快速开发工具包。同时封装了android中的Bitmap、Http、插件模块加载操作的框架,使开发者更容易轻松实现这些功能;

KJFrameForAndroid的设计思想是通过封装Android原生SDK中复杂的复杂操作而达到简化Android应用级开发,最终实现快速而又安全高效的开发APP。我们的目标是用最少的代码,完成最多的操作,用最高的效率,完成最复杂的功能。

KJFrameForAndroid 相关链接

实际项目中的使用方法演示:KJMusic音乐播放器 Demo工程运行

下载框架最新源码。

②选择KJLibraryExample工程导入Eclipse。

③将/binrary目录KJFrameForAndroid_Vxxx.jar包复制至demo的libs目录。

④删除project.properties文件的最后一行

在项目中使用 :将/binrary目录最新jar包KJFrameForAndroid_xxx.jar添加到你工程/libs目录中并引用。

  • 由于使用了SDK最新的API函数,以及3.0版Fragment。KJFrameForAndroid框架最低支持API 11。

注:使用 KJFrameForAndroid 应用开发框架需要在你项目的AndroidManifest.xml文件中加入以下基本权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

=======各模块使用介绍=======

Plugin模块

使用Plugin模块可以让你的插件apk不用安装便直接被运行,极大的方便了APP动态更新,且可以轻松实现插件与APP项目之间的解耦。

你可以在这里获取项目示例中插件的Demo apk与源码。更多介绍请看Plugin模块详细介绍

现支持以下功能

  • apk无需安装即可被应用调用
  • Activity的动态加载:包括生命周期和交互事件、R文件资源引用、插件与APP之间的数据通信
  • Fragment的完美加载使用
  • 动态注册的BroadcastReceiver
  • 绑定式、启动式Service均可完美使用
  • 已成功模拟出launchMode的效果。(launchModer实际上是一个虚拟的,生命周期的调用还是一样的,仅仅模拟出了系统的BackStack)
  • 完美集成了KJFrameForAndroid中UiLibrary->Topology的全部功能,支持注解式绑定控件设置监听

UILibrary模块

UILibrary包含两个部分Widget(控件)、Topology(Android框架结构继承链) 详细介绍…

UILibrary -> Widget控件部分 主要封装了常用的UI控件,为了不让项目jar包过大,我们只引入了开发中一定会用到的控件,例如:可上下拉的KJScrollView、圆形显示的ImageView,可以双指缩放双击缩放双指旋转的ScaleImageView、等等……更多内容请自行查看项目文件中org.kymjs.kjframe.widget包下的内容

UILibrary -> Topology拓扑部分 规范了Activity中数据及控件的初始化,并包含一个使用IOC设计思想的控件初始化方式:可通过注解的方式进行UI绑定,与设置监听,在Activity和Fragment中均可以通过一行代码绑定控件并实现点击监听;同时UILibrary为开发者定义了完善的KJActivity和KJFragment等基类,开发者只需手动继承就可以获得Topology部分的全部功能。

public class TabExample extends KJActivity {
@BindView(id = R.id.bottombar_content1, click = true)
public RadioButton mRbtn1;
@BindView(id = R.id.bottombar_content2, click = true)
private RadioButton mRbtn2;
@Override
public void setRootView() {
setContentView(R.layout.aty_tab_example);
}
@Override
protected void initWidget() {
super.initWidget();
mRbtn1.setText("控件已经初始化绑定并设置了监听");
}
@Override
public void widgetClick(View v) {
super.widgetClick(v);
switch (v.getId()) {
case R.id.bottombar_content1:
ViewInject.toast("点击了mRbtn1");
break;
case R.id.bottombar_content2:
ViewInject.toast("点击了mRbtn2");
break;
}
}
}

Topology中各函数调用顺序:

setRootView();
@BindView
initDataFromThread();(异步调用,可做耗时操作)
threadDataInited();(initDataFromThread执行完成后才会回调)
initData();
initWidget();
registerBroadcast();

BitmapLibrary模块

任何View(ImageView设置src,普通View设置bg)加载图片的时候都无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象,同时无需考虑图片加载过程中出现的OOM。默认使用内存lru算法+磁盘lru算法缓存图片 详细介绍

注:在Android2.3之前,我们常常使用软引用或弱引用的形式去做缓存图片,然而根据Google的描述:垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠。另外,Android 3.0 (API Level 11)中,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放,这就有潜在的风险造成应用程序的内存溢出并崩溃。BitmapLibrary使用lru算法去管理缓存,同时内存缓存配合磁盘缓存能更有效的管理缓存调用。

KJBitmap kjb = KJBitmap.create();
/**
* url不仅支持网络图片显示,同时支持本地SD卡上的图片显示;
* view不仅可以是imageview,同时普通view也可以传入,框架会自动识别对imageview设置src对普通view设置bg
*/
// 载入本地图片
kjb.display(imageView, "file:///storage/sdcard0/1.jpg");
// 载入网络图片
kjb.display(textView, http://www.xxx.com/xxx.jpg);
//自定义图片显示大小
kjb.display(view, http://www.xxx.com/xxx.jpg, 80, 80); //如不指定图片大小,默认采用控件大小显示图片

HttpLibrary模块

KJLibrary默认对所有Http通信的数据做了缓存处理,缓存时间为5分钟。这么做的目的不仅是为了节省用户手机流量,同时是为了减少服务器压力

HttpLibrary模块使用HttpUrlConnection实现方式实现网络通信、数据上传,使用HttpClient实现文件的断点下载。根据Google建议:在2.3系统之前由于HttpUrlConnection不稳定且有一定的BUG,应该尽量使用HttpClient;在2.3以后的系统,若只是简单的数据交互,应该使用更加轻量级、易扩展的HttpUrlConnection。

普通get、post方法示例:

kjh.get("http://www.oschina.net/", new HttpCallBack();//与post相似,就只写一种了
KJHttp kjh = new KJHttp();
HttpParams params = new HttpParams();
params.put("id", "1");
params.put("name", "kymjs");
kjh.post("http://192.168.1.149/post.php", params, new HttpCallBack() {
@Override
public void onPreStart() {
super.onPreStart();
KJLoger.debug("即将开始http请求");
}
@Override
public void onSuccess(String t) {
super.onSuccess(t);
ViewInject.longToast("请求成功");
KJLoger.debug("请求成功:" + t.toString());
}
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
super.onFailure(t, errorNo, strMsg);
KJLoger.debug("出现异常:" + strMsg);
}
@Override
public void onFinish() {
super.onFinish();
KJLoger.debug("请求完成,不管成功还是失败");
}
});

post上传文件方法示例:

// 文件上传的PHP后台实现示例
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
?>
private void upload() {
HttpParams params = new HttpParams();
//支持一次传递多个文件,这里使用UtilsLibrary中的工具类获取一个文件
params.put("file", FileUtils.getSaveFile("KJLibrary", "logo.jpg"));
new HttpCallBack() {
@Override
public void onSuccess(String t) {
super.onSuccess(t);
ViewInject.toast("文件上传完成");
}
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
super.onFailure(t, errorNo, strMsg);
ViewInject.toast("文件上传失败" + strMsg);
}
});
}

断点下载方法示例:

kjh.download(mEtDownloadPath.getText().toString(), FileUtils.getSaveFile("KJLibrary", "l.pdf"),
new HttpCallBack() {
@Override
public void onSuccess(File f) {
super.onSuccess(f);
KJLoger.debug("success");
ViewInject.toast("下载成功");
mProgress.setProgress(mProgress.getMax());
}
@Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
super.onFailure(t, errorNo, strMsg);
KJLoger.debug("onFailure");
}
/* onLoading方法只在下载方法中有效,且每秒回调一次 */
@Override
public void onLoading(long count, long current) {
super.onLoading(count, current);
mProgress.setMax((int) count);
mProgress.setProgress((int) current);
KJLoger.debug(count + "------" + current);
}
});

DBLibrary模块

包含了android中的orm框架,一行代码就可以进行增删改查。支持一对多,多对一等查询。

DB模块,很大程度上参考了finalDB的设计,并在此基础上完善了几乎全部的API注释,与更多可定制的DB操作

</p>
//普通数据存储
KJDB db = KJDB.create(this);
User ugc = new User(); //这里需要注意的是User对象必须有id属性,或者有通过@ID注解的属性
ugc.setEmail("[email protected]");
ugc.setName("kymjs");
db.save(ugc);
//一对多数据存储
public class Parent{ //JavaBean
private int id;
@OneToMany(manyColumn = "parentId")
private OneToManyLazyLoader<Parent ,Child> children;
/*....*/
}
public class Child{ //JavaBean
private int id;
private String text;
@ManyToOne(column = "parentId")
private Parent parent;
/*....*/
}
List<Parent> all = db.findAll(Parent.class);
for( Parent item : all){
if(item.getChildren ().getList().size()>0)
ViewInject.toast(item.getText() + item.getChildren().getList().get(0).getText());
}

转载请注明:Android开发中文站 » Android应用开发框架 KJFrameForAndroid


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK