`
384444165
  • 浏览: 258847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

 

第二届 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇 

 

去年得知博客分享大赛已经到了投票阶段,今年再三思考,想写点有价值的东西分享。

虽然一段时间由于各种原因没有发博客,但希望没有生疏吧。话不多说,这里我选择之前一个项目中用到的开源项目Droid-Fu作为这篇文章的话题。从第一次使用时只有官网博客上的简单信息,到现在网上也陆续有了对作者博客上介绍的使用方法的中文翻译和一点简单的介绍,但是明显在使用时候还是摸不到头绪,毕竟作者对具体使用方法介绍的比较少,api略显笼统,很难投入到应用中,我希望能通过对方法详细的介绍让大家了解、方便的利用Droid-Fu,并为这个开源项目作出贡献。

 

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-FoAsyncTask

先说SDK中自带的AsyncTaskAsyncTask提供了一个很好的机制,例如在访问web服务器、后台处理数据时最经常使用到异步任务,AsyncTask使得我们能在出完数据后反馈到activity的方式来完成异步处理。但做多了移动项目大家都会首先考虑一个问题,就是软件运行时候的来电中断是否需要处理,而对于androidactivity在来电进中断状态的机制,自然关于界面的操作都必须要考虑这个问题。而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标签修改为此类,本例定义如下

 

<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 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(提供接口方法,用来在界面端响应反馈信息)

package org.dreamfly.interfacetest;

public interface AddMethod {

	public abstract void addResultHandler(int i1,Object i2);
}
  
NewAsyncTask.java(异步task类,需要实现的方法和内容均已注释)
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)

 

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作出一份贡献,让它方便更多的开发者。

分享到:
评论

相关推荐

    android droid-fu

    Droid-Fu是一个开源的通用Android应用库,其主要目的是为让Android开发更容易,包含有许多工具类,还有非常容易用的android组件【Droid-Fu提供支持的领域包括:1、Android应用的生命周期帮助 2、支持处理Intents和...

    C#制作麻将游戏源码,

    在C#中,一个项目通常会包含多个类文件(.cs),资源文件(如图片、音频)以及其他支持文件。在这个案例中,"Mah-jong"可能代表了麻将游戏的主类或入口点。 在深入研究这个源码时,你可以期待看到以下C#编程和麻将...

    Android Zirco-browser:超越海豚的开源浏览器-IT计算机-毕业设计.zip

    《Android Zirco-browser:超越海豚的开源浏览器》 Android Zirco-browser是一款专为Android平台设计的开源浏览器,其目标是超越海豚浏览器,提供更高效、更安全的浏览体验。这款浏览器的源码公开,对于学习Android...

    [开源]Android开源项目WebSocket_async-http-client-master

    [开源]Android开源项目WebSocket_async-http-client-master

    ichartjs用户使用手册

    - **感谢语:** 表达对项目贡献者的感激之情。 #### 二、简介 - **what’s the ichartjs?:** ichartjs是一款开源的JavaScript图表库,用于在网页上绘制各种类型的图表。 - **特点:** - 开源免费:任何人都可以...

    VideoEditor-For-Android,一、安卓系统.zip

    【标题】"VideoEditor-For-Android"是一个针对安卓系统的开源视频编辑项目,它提供了在移动设备上编辑视频的功能。这个项目旨在为开发者提供一个基础框架,帮助他们快速构建自己的视频编辑应用程序。通过深入理解这...

    国外开源项目OpenHAB - 智能家居Android客户端源代码

    国外开源项目OpenHAB - 智能家居Android客户端 源代码 运行环境 Android 4.0 开放式家庭自动化的总线(openHAB)项目旨在提供一个通用的集成平台,为家庭自动化周围的一切事物。这是一个纯Java解决方案,完全基于...

    droid-dicom-viewer:从 code.google.compdroid-dicom-viewer 自动导出

    ###Disclaimer GPLv3 徽标 Droid Dicom Viewer 是一种自由开源软件 (FOSS),根据自由软件基金会发布的 GNU 通用公共许可证条款获得许可,该许可证版本可以是第 3 版,或者(由您选择)任何更高版本。 此版本的 Droid...

    android 社区源码(开源中国)

    《深入剖析Android开源中国社区应用源码》 在IT领域,源码分析是提升技能、理解软件设计原理的重要途径。开源中国社区的Android版源码为我们提供了一个宝贵的实践平台,让我们能够深入研究一个完整的社交应用是如何...

    sqlcipher-for-android-v3.5.6.zip

    SQLCipher for Android是一款针对Android平台的安全扩展,它为SQLite数据库提供了强大的加密功能,确保应用程序中的敏感数据在存储和传输过程中得到充分保护。v3.5.6是此库的一个特定版本,提供了对不同架构的支持,...

    最好的开源midi合成算法fluidsynth-android

    **流体合成器(FluidSynth):音乐与开源的完美结合** 在IT行业中,开源软件扮演着不可或缺的角色,它们提供了自由、灵活且强大的工具,让开发者能够构建各种创新应用。"fluidsynth-android"正是这样一个例子,它将...

    开源框架android-async-http-master

    《Android异步HTTP库android-async-http-master深度解析》 在Android应用开发中,网络通信是不可或缺的一部分,尤其是在处理用户交互、数据同步等场景时。`android-async-http`是一个非常流行的开源框架,用于简化...

    开源项目-verybluebot-tarinator-go.zip

    开源项目-verybluebot-tarinator-go.zip,Tarinator-go: a Golang package for taring and untaring files with ease

    android开源项目源码,完整商城项目源码(服务端+客户端)

    该开源项目是一个全面的Android商城应用,包含了服务端和客户端的源代码,旨在提供一个学习和实践Android开发,特别是电商应用开发的平台。这个项目涵盖了从用户界面设计、数据交互到后端服务处理的全套解决方案。 ...

    ArcGIS for Android开发教程

    ### ArcGIS for Android 开发教程知识点总结 #### 第一章:基本概念 ##### 1. Android简介 2007年11月,Google推出了移动操作系统Android,这是一款专为移动终端设计的开放且完整的操作系统。自那时起,基于...

    talon-for-twitter-android,我流行的android talon for twitter应用程序的材料设计版本,100%开源.zip

    总之,"talon-for-twitter-android"项目为Android开发者提供了一个绝佳的学习和实践平台,不仅可以深入理解Android应用开发,还能接触并参与到开源社区的活动中,提升自己的编程技能和协作能力。

    廖祜秋-React Native for Android

    根据提供的文件内容,以下是对"廖祜秋-React Native for Android"文档的知识点汇总: 知识点一:React Native简介 React Native是由Facebook开发的一个开源框架,用于构建能够在iOS和Android上运行的原生移动应用。...

    android-async-http:.zip

    在这里,我们重点关注的是一个名为`android-async-http`的开源项目,它是一个为Android平台设计的高效、易用的异步HTTP库。 一、项目概述 `android-async-http`是由Leonardo电子书(Leonardo da Vinci)创建并维护...

    ffmpeg H264 转为MP4

    在数字视频处理领域,ffmpeg是一款非常强大的开源工具包,能够帮助用户实现多种视频、音频文件的转换、剪辑等操作。本文主要介绍如何利用ffmpeg将采用H264编码的RTSP实时流转换为MP4或AVI格式。 #### 基本概念 - *...

Global site tag (gtag.js) - Google Analytics