开源异步处项目Droid-Fu详解 For Android: BetterActivity, BetterService And BetterAsyncTask

1. Droid-Fo初体验

显然,要了解它,首先应该说清楚它是什么,标题中提到了它是做什么的,但毕竟太笼统。首先我不得不先提到给我们开发者带来巨大方便的作者Jabber,就在这里把作者对这个项目的介绍作为一个入口吧:

http://brainflush.wordpress.com/2009/11/16/introducing-droid-fu-for-android-betteractivity-betterservice-and-betterasynctask/

通过这个地址你可以找到更多的资源和作者的介绍。关于这个项目,这里我尊重作者的介绍:

 

Droid-Fu contains utility classes as well as some self-contained, ready to use Android components, all of which I consider useful for typical Android applications. Some of the areas for which Droid-Fu offers 

support classes include:

application life-cycle

background tasks

HTTP messaging

(remote) image handling

custom adapters

… and more. The library is still young, so expect to see a lot more stuff forthcoming!

 

由于浏览博客都可以得到问题的答案,我这里想详细提到的就是它能给大家带来什么方便。当然建议这之前您先了解它是做什么的。

从我的认识,作者为什么取名better+android提供的几大主体生命形式,是因为它很好的解决了异步问题,简单的说是后台任务的一个非常好选择。也许你用过android sdk中带有的AsyncTask,与之类似,主要将整个项目的所有异步问题予以处理。这是在项目用到的最主要的部分,如果您有什么看法和使用经验欢迎提出建议了!

 

2. Droid-Fo与AsyncTask

先说SDK中自带的AsyncTask,AsyncTask提供了一个很好的机制,例如在访问web服务器、后台处理数据时最经常使用到异步任务,AsyncTask使得我们能在出完数据后反馈到activity的方式来完成异步处理。但做多了移动项目大家都会首先考虑一个问题,就是软件运行时候的来电中断是否需要处理,而对于android中activity在来电进中断状态的机制,自然关于界面的操作都必须要考虑这个问题。而AsyncTask无法很好的解决这个问题,并且通过测试在中断activity的操作中都会使得AsyncTask表现出不稳定,所以才有了Droid-Fo解决这些问题。虽然可以通过定时查看和重复发送机制解决这些问题,但是代价是我们不希望看到的。Droid-Fo是在原有的一些类基础上修改过后的产品,所以这个开源项目并不神秘,大量的引用了android自带的SDK。说到这里应该不必再介绍Droid-Fo的优点了。

 

 

3. Droid-Fo基本格式

 我们来做一个demo,主要完成以下功能:

 

一个含有textview的界面,在程序被加载时就执行后台任务。

后台任务返回1,而整个task返回0和后台任务的返回值到界面的textview显示。

后台任务和接受到后台返回参数时需要打印debug属性的日志

 

首先介绍下使用Droid-Fo的基本格式:

[1].  需要在根目录生成一个继承自DroidFuApplication的类,如本例使用MyApplication类作为此继承类,不需要写入内容

[2].  在AndroidManifest.xml需要定义application的android:name标签修改为此类,本例定义如下

 

Xml代码  

  1. <application android:name=".MyApplication" android:icon="@drawable/icon" android:label="@string/app_name">  
  2.         <activity android:name=".InterfaceTest"  
  3.                   android:label="@string/app_name">  
  4.             <intent-filter>  
  5.                 <action android:name="android.intent.action.MAIN" />  
  6.                 <category android:name="android.intent.category.LAUNCHER" />  
  7.             </intent-filter>  
  8.         </activity>  
  9. </application>  

[3]. 继承自BetterDefaultActivity的Activity,本例只有入口Activity为InterfaceTest

[4]. 再加上继承自BetterAsyncTask的一个task类

[5]. string.xml中如下定义

 

Xml代码  

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="hello">Hello World, InterfaceTest!</string>  
  4.     <string name="app_name">InterfaceTest</string>   
  5.     <string name="droidfu_progress_dialog_title">droidfu_progress_dialog_title</string>   
  6.     <string name="droidfu_progress_dialog_message">正在进行</string>   
  7. </resources>  

可以看到第3、4个为与不同string.xml的区别,如果缺少将不能正常运行。简单说下,第3个是如果需要等待时,显示的等待dialog的标题,第四个自然是dialog的内容

 

也许您在读作者的介绍时没有找到这些缺一不可的元素,那么我的第一个小目的算是达到了,起码能帮助你成功的完成最简单的一个Droid-Fo应用,完成后台任务。解决了作者说明不清、缺少文档的小小缺陷。

 

4. 项目中的Droid-Fo(demo)

代码不多,我们直接一个个来看

(以下是我在项目中使用的框架形式,主要是将activity继承特定接口,使得很多相似的功能可以抽象为共同的接口来处理,比如同样为添加操作,可以在界面端提示相同的内容;或者指定申请的类型,来判断反馈信息的内容,这时申请格式又可能可以统一来处理,如同样添加梨子和苹果和传入pearTaskId和appleTaskId来区分反馈信息的处理。从而实现了页面与底层逻辑的分离,将界面处理放在activity中,而后台操作放在task中去做)

 

 AddMethod.java(提供接口方法,用来在界面端响应反馈信息)

Java代码  

  1. package org.dreamfly.interfacetest;  
  2.   
  3. public interface AddMethod {  
  4.   
  5.     public abstract void addResultHandler(int i1,Object i2);  
  6. }  

  

NewAsyncTask.java(异步task类,需要实现的方法和内容均已注释)

Java代码  

  1. package org.dreamfly.interfacetest;  
  2.   
  3. import android.content.Context;  
  4. import android.util.Log;  
  5.   
  6. import com.github.droidfu.concurrent.BetterAsyncTask;  
  7.   
  8. public class NewAsyncTask extends  
  9.         BetterAsyncTask<String, Void, String> {  
  10.   
  11.     AddMethod addMethod;  
  12.       
  13.     /** 
  14.      * Constructor 
  15.      * @param arg0  
  16.      * @param addMethod :the interface,it is also the Activity arg0 
  17.      * @param needDialog :need dialog or not when the task run in background for holding 
  18.      */  
  19.     public NewAsyncTask(Context arg0,AddMethod addMethod ,Boolean needDialog) {  
  20.         super(arg0);  
  21.         // TODO Auto-generated constructor stub  
  22.           
  23.         this.addMethod=addMethod;  
  24.         if(!needDialog){  
  25.             super.disableDialog();  
  26.         }  
  27.           
  28.     }  
  29.   
  30.     /** 
  31.      * when the handling of asynctask end, system call the after() method  
  32.      */  
  33.     @Override  
  34.     protected void after(Context arg0, String obj) {  
  35.         // TODO Auto-generated method stub  
  36.           
  37.         final Object obj2=obj;  
  38.           
  39.         Log.d(Constants.logTag, "the obj receive by method after:"+obj+".");  
  40.         addMethod.addResultHandler(0, obj2);  
  41.     }  
  42.   
  43.     @Override  
  44.     protected void handleError(Context arg0, Exception arg1) {  
  45.         // TODO Auto-generated method stub  
  46.           
  47.     }  
  48.       
  49.     /** 
  50.      * asynctask , do in backgroud 
  51.      */  
  52.     protected String doCheckedInBackground(Context context,String... obj) throws Exception{  
  53.         super.doCheckedInBackground(context, obj);  
  54.           
  55.         Log.d(Constants.logTag, "this is docheckedinbackground, i'll return 1.");  
  56.         return 1+"";  
  57.     }  
  58. }  

 

InterfaceTest.java(入口activity)

 

Java代码  

  1. package org.dreamfly.interfacetest;  
  2.   
  3. import com.github.droidfu.activities.BetterDefaultActivity;  
  4.   
  5. import android.os.Bundle;  
  6. import android.widget.TextView;  
  7.   
  8. public class InterfaceTest extends BetterDefaultActivity implements AddMethod{  
  9.     /** Called when the activity is first created. */  
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.           
  15.         NewAsyncTask na=new NewAsyncTask(this,this,true);  
  16.         na.execute();  
  17.     }  
  18.   
  19.     /** 
  20.      * handle the async result 
  21.      */  
  22.     public void addResultHandler(int i1, Object i2) {  
  23.         // TODO Auto-generated method stub  
  24.         TextView tv=(TextView)findViewById(R.id.text);  
  25.         tv.setText(i1+" "+i2);  
  26.     }  
  27. }  

 

好了,这里应该可以清楚的看出这个框架的格式了。功能很简单,想通过最简单的形式来表现固定的格式。在真实中小型项目开发中效率和运行结果都很可观。

 

5. demo的运行结果 

像前面所说的demo实现的功能很简单,这里我们为了能更好的了解流程,贴出需求中提出的运行结果和log信息:

 

 

 

 

最后附件中附上工程和源码,希望大家能快捷的上手这个还发展不完全的开源项目,解决您遇到的异步信息处理问题。好的开源项目需要大家一起去推动,希望共同努力的同时我们都可以为Droid-Fu作出一份贡献,让它方便更多的开发者。

时间: 2024-09-10 10:27:08

开源异步处项目Droid-Fu详解 For Android: BetterActivity, BetterService And BetterAsyncTask的相关文章

Android多线程----异步消息处理机制之Handler详解

[正文] 虽然是国庆佳节,但也不能停止学习的脚步,我选择在教研室为祖国母亲默默地庆生. 关于Android的多线程知识,请参考本人之前的一篇博客:Android 多线程----AsyncTask异步任务详解 在Android当中,提供了异步消息处理机制的两种方式来解决线程之间的通信问题,一种是今天要讲的Handler的机制,还有一种就是之前讲过的 AsyncTask 机制. 一.handler的引入: 我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会

Android项目基本结构详解_Android

一.简介 第3章虽然通过百度地图应用展示了你可能感兴趣的内容,但是,如果你是一个初学者,一开始就看懂和理解代码可能会非常费劲.为了解决此问题,从这一章开始,本模块将从最基本的内容讲起,带你逐步进入用C#进行Android应用开发的乐园. 二.AndroidApp入口 要用C#开发Android应用程序,首先需要对项目的基本结构有一个感性认识.如下图所示: Android应用程序使用的是单一入口,源程序中并不能一眼看出程序从哪开始运行,当应用程序加载到内存中时,Android操作系统会自动从内部自

vue.js+boostrap项目实践(案例详解)_javascript技巧

一.为什么要写这篇文章 最近忙里偷闲学了一下vue.js,同时也复习了一下boostrap,发现这两种东西如果同时运用到一起,可以发挥很强大的作用,boostrap优雅的样式和丰富的组件使得页面开发变得更美观和更容易,同时vue.js又是可以绑定model和view(这个相当于MVC中的,M和V之间的关系),使得对数据变换的操作变得更加的简易,简化了很多的逻辑代码. 二.学习这篇文章需要具备的知识 1.需要有vue.js的知识 2.需要有一定的HTML.CSS.JavaScript的基础知识 3

Android菜单详解——理解android中的Menu

Android菜单详解--理解android中的Menu 前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu&qu

【框架】[Spring3]下载安装、开源框架与IoC控制反转详解

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 昨天刚刚初学Spring3,也许Spring3有点老了哈,不过还是先把3学了再去学习4吧,首先先介绍一下如何去下载Spring的必须包吧. (本篇博客适用于初学Spring的朋友) java spring4现在不推荐使用xml配置文件- 当然啦,这些知识点在Spring4还是可以用的. 不过我在这里详解的还是Spring3哈,见谅~ 下载SpringJAR包/文档: Spring官

又拍云异步上传实例教程详解_php实例

网站静态文件存储在又拍云,之前上传是通过又拍云的的FORM API进行. 当产品经理歪着脑袋走向你的时候,哎呀呀,这用户信息这里,上传要无刷新的效果了.  这他***,自己偷偷抱怨一会会,怎么搞喃?听说这家伙要一个好听的名字,异步上传,高大上档次挺像我的. 根据我们的观察,此处有两个重点: ①.怎么实现异步上传 ②.怎么上传到又 拍 云 首先我们要实现异步上传,就需要利用js里面的FormData对象,据说,这家伙不支持ie6 7的,ie8就不太清楚了,据说哈,说错了不负责的. 不过喃,我们也不

开源项目SlideMenu使用详解

以前搞过一个滑动菜单,是自己重写发view,实现了基本功能可以滑动显示,后来看了下SlideMenu的使用,真是非常强大,不但可是简单的设置实现两侧滑动菜单,还可以设置菜单的阴影.渐变色.划动模式等,所以还是老实点直接用现成的吧,当然有时间的话还要看先SlideMenu的源码.这里先详细分析下SlideMenu的使用: 准备工作: 1. SlidingMenu 下载地址: https://github.com/jfeinstein10/SlidingMenu2.下载好后,导入到我们eclipse

“移山”法宝~阿里数据库迁移项目yugong(愚公)开源啦!【内有详解】

项目简介 yugong(意译:愚公)项目是阿里的开源项目,该项目使用纯Java开发,主要作用是进行数据库迁移,目前该项目主要支持从oracle数据库向Mysql和DRDS数据库进行迁移. 项目背景 08年左右,阿里巴巴开始尝试MySQL的相关研究,并开发了基于MySQL分库分表技术的相关产品,Cobar/TDDL(目前为阿里云DRDS产品),解决了单机Oracle无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目因此而诞生,其要解决的目标就是帮助用户完成从Oracle数据迁移到M

阿里自主研发的互动游戏引擎Hilo开源啦!【内有详解】

目前,Hilo已经开源,并入到Hilo Team中.开源地址 https://github.com/hiloteam/Hilo (欢迎Star) Hilo的特点: 极简内核: Hilo核心模块极精简,保留了2D游戏引擎最必要的模块,同时采用模块化管理. 完善接入&扩展: Hilo 支持多种模块范式的包装版本,包括AMD,CMD,Standalone多种方式接入.另外,你可以新增和扩展需要的模块和类型. 多种渲染方式:提供DOM,Canvas,Flash,WebGL等多种渲染方案,可以做到跨全端,