`
384444165
  • 浏览: 258450 次
  • 性别: 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作出一份贡献,让它方便更多的开发者。

分享到:
评论

相关推荐

    26.[开源][安卓][通用Android应用库]droid-fu-master

    26.[开源][安卓][通用Android应用库]droid-fu-master

    经典开源项目android-async-http-master

    "经典开源项目android-async-http-master" 是一个在GitHub上广受欢迎的Android库,它专门用于简化Android应用程序中的异步HTTP请求。这个项目的核心目标是为Android开发者提供一个轻量级、高效的网络通信框架,使得...

    C#制作麻将游戏源码,

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

    qt自定义控件(开源)

    #QtCustomWidgets 说明格式如下: 项目名称 编译环境 运行截图 注意事项 #ColorProgressBar 多彩进度条 编译环境: Qt5.x + mingw-QtCreater 运行截图: progressbarcolor为原版代码 #DynamicProgressBar 多态进度条 ...

    droid fu android应用框架源码

    【标题】:“Droid Fu Android应用框架源码” 【描述】:“Droid Fu是一个专为Android应用程序设计的框架,提供了许多实用的功能,旨在简化开发者的工作。这个资源是Droid Fu的源码,虽然原始的GitHub仓库可能已经...

    U-Boot详解 U-Boot详解

    **U-Boot详解** U-Boot,全称Micro Universal Boot Loader,是一款开源的嵌入式系统引导加载器,主要用于各种嵌入式设备和系统,包括单片机、SoC(System on Chip)以及嵌入式计算机系统。它在启动过程中执行初始化...

    droid-feed:有关Android开发的汇总的Android新闻,文章,播客和会议

    标题“droid-feed”是一个与Android开发相关的项目,主要目的是提供一个集中的平台,用于分享和获取最新的Android开发资讯、文章、播客以及会议信息。这个项目可能是一个开源应用或者服务,帮助开发者及时跟踪...

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

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

    ichartjs用户使用手册

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

    java版商城源码下载-Android-Open-Source:Android开源资源

    本文为那些不错的Android开源项目第三篇——优秀项目篇,主要介绍那些还不错的完整Android项目。 最新内容请访问AndroidOpenProject@Github,欢迎Star和Fork。 Android开源项目系列汇总已完成,包括: Android开源...

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

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

    ArcGIS for Android开发教程

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

    android-async-http:.zip

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

    廖祜秋-React Native for Android

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

    qemu-img windows工具

    QEMU(Quick Emulator)是一款强大的开源虚拟化软件,它提供了多种虚拟化功能,包括硬件模拟和半虚拟化。QEMU-img是QEMU项目的一部分,专门用于管理和转换虚拟机镜像文件。在Windows环境中,QEMU-img工具允许用户对...

    MuPDF阅读PDF文件(AndroidStudio版)

    这个项目是针对Android Studio的,提供了使用MuPDF库在Android应用中阅读PDF文件的示例代码。以下是对该主题的详细解释: 1. **MuPDF介绍**: MuPDF是由Artifex Software开发的开源PDF、XPS和CBZ格式的查看器。它...

    android开源项目大全[最经典项目]

    Droid Wall 手机防火墙 jchat4android手机聊天程序 OpenSudoku一个简单的九宫格数独游戏 quitesleep手机电话功能软件 rokon_src_2-0-3_游戏引擎 sipdroid语音及视频通话 TorProxy应用实现了Android手机无线电电传...

    Android手机平台音乐播放器毕业论文

    本文是关于在Android手机平台上构建音乐播放器的毕业论文,主要涵盖了从项目背景、系统需求分析到具体功能设计和数据库设计等多个方面。以下是对这些内容的详细解释: **第一章 引言** 1.1 项目背景:随着智能手机...

Global site tag (gtag.js) - Google Analytics