2014年10月13日星期一

Androidˇň---ThinkAndroid

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Androidˇ�---ThinkAndroid  阅读原文»

用户名:poarry 文章数:13 评论数:1
访问量:2289:188:132:1 注册日期:2012-09-12

Android开发框架之---ThinkAndroid

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(String 
OALP2 ¨C Cubeí  阅读原文»

用户名:jiangtianwuchen 文章数:15 评论数:0
访问量:217:285:162:2 注册日期:2014-05-16

OALP数据库优化之2 Cube处理优化

OALP数据库优化之2 Cube处理优化

当我们在OLAP数据库的世界中说起Process的时候,它至少可以分为两类:维度的处理跟Cube的处理,本部分只讨论cube的处理及优化,维度的处理优化会在另一部分讨论。

首先我们应该明确所谓处理(Process)这个概念,它可以简单的理解为将数据从一个或多个数据源加载、搬移到分析服务对象中的过程,对Cube处理来说就是加载到度量值组分区中的过程,所以Cube处理的优化其实归根结底是分区的处理优化。

如下图所示,分区的处理过程可以分为两步:

wKioL1Q3hxLhmmSHAABeCcZQzro762.jpg

1.处理事实数据

处理事实数据简单的说就是将数据从数据源搬到分区对象的过程,因为分区中的事实数据需要关联到维度,所以中间还有一步是查找与事实数据对应的已经处理的维度键值。下面三步并行执行已完成事实处理:

  1. 发送SQL查询来从源中抽取数据,好像是每次10万行

  2. 为上面读入的10万行数据在分析服务的维度对象中查找响应的维度键值,然后填充到处理缓存中

  3. 当处理缓存满的时候,将数据写入到磁盘中

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这个目录下面,包括:

wKioL1Q3hyaTM-n9AAFBumFBEUM375.jpg

  • Process Report Begin

事件ID5,它表示所有OLAP数据库相关的处理报告的开始事件

  • Process Report Current

事件ID7,它表示所有进度报告当前状态事件。例如,在处理期间,当前报表包含有关被处理的对象(维度、分区、多维数据集等)的处理信息

  • Process Report End

事件ID6,它表示所有OLAP数据库相关的处理报告的开始事件

  • Process Report Error

事件ID8,它表示所有处理报告错误事件

从我个人的使用情况来说,我一般只使用Process ReportEnd事件,因为所有的事件都是以Begin开始,中间经历Current最后以EndError结束。因为我使用Profiler只是用来调优而不是找错,所以不需要Error事件;而任何出现在ProcessReport Begin的事件肯定最后会反应在Process Report End事件中(应该是这样的吧?),所以ProcessReport BeginProcess 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

    阅读更多内容

没有评论:

发表评论