`
384444165
  • 浏览: 257957 次
  • 性别: 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

    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仓库可能已经...

    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开源...

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

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

    ArcGIS for Android开发教程

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

    廖祜秋-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工具允许用户对...

    ffmpeg H264 转为MP4

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

    MuPDF阅读PDF文件(AndroidStudio版)

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

    8:Android项目源码-毕业设计源码(168套).rar

    [开源项目]Android_炫酷的3D音乐播放器_各种特效OpenGL.zip andorid 源码北京公交线路查询(离线).zip android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip Android ListView下拉刷新 Demo.zip ...

    android源码.java-kotlin-for-android-course:来自“面向Android和Java开发人员的Kotlin”课

    【标签】"系统开源"提示了这门课程可能涉及Android系统的开源特性,包括如何利用开源库、框架,以及遵循开源许可证来编写和发布自己的代码。Android是一个开放源代码项目,允许开发者深入理解其工作原理并进行定制。...

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

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

    tar for windows windows运行tar打包工具

    对于开发和维护跨平台项目的人来说,熟悉`tar`命令的使用能够提高工作效率。 总的来说,`tar for windows`为Windows用户带来了Unix/Linux风格的打包工具,使得文件管理更加便捷。通过熟练掌握`tar`命令,不仅可以...

Global site tag (gtag.js) - Google Analytics