您的位置:首页 > 移动开发 > Android开发

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

2012-05-31 11:28 567 查看
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代码



<application android:name=".MyApplication" android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".InterfaceTest"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

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

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

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



Xml代码



<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, InterfaceTest!</string>
<string name="app_name">InterfaceTest</string>
<string name="droidfu_progress_dialog_title">droidfu_progress_dialog_title</string>
<string name="droidfu_progress_dialog_message">正在进行</string>
</resources>

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



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



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

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

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



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

Java代码



package org.dreamfly.interfacetest;

public interface AddMethod {

public abstract void addResultHandler(int i1,Object i2);
}


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

Java代码



package org.dreamfly.interfacetest;

import android.content.Context;
import android.util.Log;

import com.github.droidfu.concurrent.BetterAsyncTask;

public class NewAsyncTask extends
BetterAsyncTask<String, Void, String> {

AddMethod addMethod;

/**
* Constructor
* @param arg0
* @param addMethod :the interface,it is also the Activity arg0
* @param needDialog :need dialog or not when the task run in background for holding
*/
public NewAsyncTask(Context arg0,AddMethod addMethod ,Boolean needDialog) {
super(arg0);
// TODO Auto-generated constructor stub

this.addMethod=addMethod;
if(!needDialog){
super.disableDialog();
}

}

/**
* when the handling of asynctask end, system call the after() method
*/
@Override
protected void after(Context arg0, String obj) {
// TODO Auto-generated method stub

final Object obj2=obj;

Log.d(Constants.logTag, "the obj receive by method after:"+obj+".");
addMethod.addResultHandler(0, obj2);
}

@Override
protected void handleError(Context arg0, Exception arg1) {
// TODO Auto-generated method stub

}

/**
* asynctask , do in backgroud
*/
protected String doCheckedInBackground(Context context,String... obj) throws Exception{
super.doCheckedInBackground(context, obj);

Log.d(Constants.logTag, "this is docheckedinbackground, i'll return 1.");
return 1+"";
}
}


InterfaceTest.java(入口activity)


Java代码



package org.dreamfly.interfacetest;

import com.github.droidfu.activities.BetterDefaultActivity;

import android.os.Bundle;
import android.widget.TextView;

public class InterfaceTest extends BetterDefaultActivity implements AddMethod{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

NewAsyncTask na=new NewAsyncTask(this,this,true);
na.execute();
}

/**
* handle the async result
*/
public void addResultHandler(int i1, Object i2) {
// TODO Auto-generated method stub
TextView tv=(TextView)findViewById(R.id.text);
tv.setText(i1+" "+i2);
}
}


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



5. demo的运行结果

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















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

InterfaceTest.rar (235.4 KB)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: