用户名:poarry 文章数:13 评论数:1
访问量:2289:188:132:1 注册日期:2012-09-12
ThinkAndroid简介
ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行 Android应用程序的开发,包含Android mvc、简易sqlite orm、ioc模块、封装Android httpclitent的http模块, 具有快速构建文件缓存功能,无需考虑缓存文件的格式,都可以非常轻松的实现缓存,它还基于文件缓存模块实现了图片缓存功能, 在android中加载的图片的时候,对oom的问题,和对加载图片错位的问题都轻易解决。他还包括了一个手机开发中经常应用的实用工具类, 如日志管理,配置文件管理,android下载器模块,网络切换检测等等工具。
-
MVC模块:实现视图与模型的分离。
-
ioc模块:android中的ioc模块,完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。
-
数据库模块:android中的orm框架,使用了线程池对sqlite进行操作。
-
http模块:通过httpclient进行封装http数据请求,支持异步及同步方式加载。
-
缓存模块:通过简单的配置及设计可以很好的实现缓存,对缓存可以随意的配置
-
图片缓存模块:imageview加载图片的时候无需考虑图片加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。
-
配置器模块:可以对简易的实现配对配置的操作,目前配置文件可以支持Preference、Properties对配置进行存取。
-
日志打印模块:可以较快的轻易的是实现日志打印,支持日志打印的扩展,目前支持对sdcard写入本地打印、以及控制台打印
-
下载器模块:可以简单的实现多线程下载、后台下载、断点续传、对下载进行控制、如开始、暂停、删除等等。
-
网络状态检测模块:当网络状态改变时,对其进行检测。
<!-- 访问互联网权限 根据需要添加--><uses-permission android:name="android.permission.INTERNET" /><!-- SDCARD读写权限 根据需要添加 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!-- 网络状态检测权限 根据需要添加--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 配置: <receiver android:name="com.ta.util.netstate.TANetworkStateReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> <application android:name="com.ta.TAApplication" > application必须配置以上格式
-
MVC模块:实现视图与模型的分离。
getTAApplication().registerCommand(R.string.comand, TAIdentityCommand.class); getTAApplication().registerCommand(R.string.comand, TAIdentityCommand.class); TALogger.addLogger(new TAPrintToFileLogger()); TARequest request = new TARequest(); doCommand(R.string.comand, request, new TAIResponseListener() { @Override public void onStart(TAResponse response) { // TODO Auto-generated method stub } @Override public void onSuccess(TAResponse response) { // TODO Auto-generated method stub } @Override public void onRuning(TAResponse response) { // TODO Auto-generated method stub } @Override public void onFailure(TAResponse response) { // TODO Auto-generated method stub } }, false, true, true);package com.ta.mvc.command;import com.ta.mvc.common.TAIResponseListener;import com.ta.mvc.common.TARequest;import com.ta.mvc.common.TAResponse;public class TAIdentityCommand extends TACommand{ @Override protected void executeCommand() { // TODO Auto-generated method stub TARequest request = getRequest(); TAResponse response = new TAResponse(); response.setTag(request.getTag()); response.setData(request.getData()); response.setActivityKey((String) request.getActivityKey()); response.setActivityKeyResID(request.getActivityKeyResID()); setResponse(response); notifyListener(true); } protected void notifyListener(boolean success) { TAIResponseListener responseListener = getResponseListener(); if (responseListener != null) { onComandUpdate(command_success); } }}
-
完全注解方式就可以进行UI绑定、res中的资源的读取、以及对象的初始化。
public class ThinkAndroidDemoActivity extends TAActivity { @TAInject Entity entity; //目前只能对无参构造函数进行初始化 @@TAInject(id=R.string.app_name) String appNameString; @TAInjectResource(id=R.attr.test) int[] test; @TAInjectView(id=R.id.add); Button addButton;}
-
android中的orm框架,使用了线程池对sqlite进行操作。
public class ThinkAndroidDemoActivity extends TAActivity { TASQLiteDatabasePool sqlitePool = getTAApplication() .getSQLiteDatabasePool(); TASQLiteDatabase sqliteDatabase=sqlitePool.getSQLiteDatabase(); //使用中 sqliteDatabase.insert(entity); sqlitePool.returnSQLiteDatabase(sqliteDatabase); }
AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.thinkandroid.cn/", new AsyncHttpResponseHandler() { @Override public void onSuccess(String content) { // TODO Auto-generated method stub super.onSuccess(content); TALogger.d(LoginActivity.this, content); } @Override public void onStart() { // TODO Auto-generated method stub super.onStart(); } @Override public void onFailure(Throwable error) { // TODO Auto-generated method stub super.onFailure(error); } @Override public void onFinish() { // TODO Auto-generated method stub super.onFinish(); } });
TASyncHttpClient client = new TASyncHttpClient(); client.get("http://www.thinkandroid.cn/", new AsyncHttpResponseHandler() { @Override public void onSuccess(String content) { // TODO Auto-generated method stub super.onSuccess(content); TALogger.d(LoginActivity.this, content); } @Override public void onStart() { // TODO Auto-generated method stub super.onStart(); } @Override public void onFailure(Throwable error) { // TODO Auto-generated method stub super.onFailure(error); } @Override public void onFinish() { // TODO Auto-generated method stub super.onFinish(); } });
使用http模块上传文件 或者 提交数据 到服务器(post方法)
RequestParams params = new RequestParams(); params.put("username", "white_cat"); params.put("password", "123456"); params.put("email", "2640017581@qq.com"); params.put("profile_picture", new File("/mnt/sdcard/testpic.jpg")); // 上传文件 params.put("profile_picture2", inputStream); // 上传数据流 params.put("profile_picture3", new ByteArrayInputStream(bytes)); // 提交字节流 client.post("http://www.thinkandroid.cn/", new AsyncHttpResponseHandler() { @Override public void onSuccess(StringOALP2 ¨C Cubeí 阅读原文»用户名:jiangtianwuchen 文章数:15 评论数:0
访问量:217:285:162:2 注册日期:2014-05-16OALP数据库优化之2 Cube处理优化OALP数据库优化之2 Cube处理优化
当我们在OLAP数据库的世界中说起Process的时候,它至少可以分为两类:维度的处理跟Cube的处理,本部分只讨论cube的处理及优化,维度的处理优化会在另一部分讨论。
首先我们应该明确所谓处理(Process)这个概念,它可以简单的理解为将数据从一个或多个数据源加载、搬移到分析服务对象中的过程,对Cube处理来说就是加载到度量值组分区中的过程,所以Cube处理的优化其实归根结底是分区的处理优化。
如下图所示,分区的处理过程可以分为两步:
1.处理事实数据
处理事实数据简单的说就是将数据从数据源搬到分区对象的过程,因为分区中的事实数据需要关联到维度,所以中间还有一步是查找与事实数据对应的已经处理的维度键值。下面三步并行执行已完成事实处理:
发送SQL查询来从源中抽取数据,好像是每次10万行
为上面读入的10万行数据在分析服务的维度对象中查找响应的维度键值,然后填充到处理缓存中
当处理缓存满的时候,将数据写入到磁盘中
2.构建聚合及位图索引
在事实数据被处理到分区对象之后,处理就开始构建聚合及位图索引。聚合的处理是在内存中进行的,如果内存不足以构建所有的聚合,那么就会一块一块的先写入到磁盘的临时文件,在处理的最后做合并。
在设计OLAP数据库的时候我们应该在聚合上做均衡的考虑,因为大量的聚合肯定会提高查询的效率,但是同时会降低处理的效率。
分区的处理是通过向OLAP数据库发出分区处理命令进行的,主要有以下的分区处理命令:
ProcessFull
全处理会首先删除现有的存储内容(事实数据、聚合及位图索引),然后首先执行ProcessData过程,紧接着执行ProcessIndexes
ProcessData
处理数据命令也是首先删除现有的存储内容(事实数据、聚合及位图索引),然后处理事实数据,但是不会构建聚合及位图索引
ProcessIndexes
该命令执行的时候假设事实数据已经存在了,它在事实数据上构建新的聚集及位图索引
ProcessAdd
该命令创建一个临时分区,在其上执行完全执行,最后将临时分区Merge到目标分区中。该命令式一个XMLA命令,在UI上名为ProcessIncremental
ProcessClear
删除分区中现有的存储内容,它是XMLA的命令,在UI上名为UnProcess
ProcessClear Indexes
仅删除分区中的聚合及位图索引
我们可以使用SQL Server自带的Profiler来对OLAP数据库的处理做监控,首先我们需要知道Profiler中哪些Events是用来监控OLAP处理的,其实这个问题比较显而易见,所有与之相关的事件都处于Process Reports这个目录下面,包括:
Process Report Begin
事件ID为5,它表示所有OLAP数据库相关的处理报告的开始事件
Process Report Current
事件ID为7,它表示所有进度报告当前状态事件。例如,在处理期间,当前报表包含有关被处理的对象(维度、分区、多维数据集等)的处理信息
Process Report End
事件ID为6,它表示所有OLAP数据库相关的处理报告的开始事件
Process Report Error
事件ID为8,它表示所有处理报告错误事件
从我个人的使用情况来说,我一般只使用Process ReportEnd事件,因为所有的事件都是以Begin开始,中间经历Current最后以End或Error结束。因为我使用Profiler只是用来调优而不是找错,所以不需要Error事件;而任何出现在ProcessReport Begin的事件肯定最后会反应在Process Report End事件中(应该是这样的吧?),所以ProcessReport Begin和Process Report End之间我们只需要Process Report End就可以了;对于ProcessReport Current,本人不是太明白这个事件是干什么的,不过它有一个其他事件无法代替的作用:假如度量值组有1千万数据,AS肯定是没办反一次性都读入内存然后处理的,所以它会每次读取比如10万数据来处理,然后再处理10万直至全部处理完,ProcessReport Current能捕获到现在为止处理的数据行数。
接下来我们要知道的是关于Profiler捕获到的数据都有哪些信息,说白了就是有哪些数据列。我们在此只列出最主要的数据列:
EventSubClass OLAP数据库处理事件类,下面是一些主要的事件
Process
Merge
Delete
DeleteOldAggregations
Rebuild
Commit
Rollback
CreateIndexes
CreateTable
InsertInto
Transaction
Initialize
订阅: 博文评论 (Atom)
没有评论:
发表评论