一、为什么造轮子
一来android现在的轮子比较少. 二来,写轮子可以锻炼自己,逼迫自己深入学习.造轮子的乐趣实践者会比较容易理解,不管是阅读美好的设计,还是迭代改善自己的设计,都会给程序员带来快乐.
二、关于QADDroid
QADDroid正如其名,目标是帮助android程序员简单粗暴地快速开发.它的组成部分如下:
1.Base组件:提供了android基本组件的Base版本,包含许多便捷的方法.
2.AutoInject:仿照roboguice的inject注解.但也只包含这些注解,没有与guice结合.(guice太大了 = =)
3.Loader:客户端程序80%的时候需要做联网开发.这其中通常是非常耗费程序员精力的,又要管理线程,又要管理连接.Loader希望将程序员从中解脱出来.它将加载服务的逻辑与加载器(线程模型)分离开来.
4.Render:其实是注入的另外一种.使用它可以摆脱编写Adapter以及众多的view.setXX方法.
5.其它:抄袭并精简了nutz的lang包代码.对其做了android版加强,并添加了若干工具类.
这是github的路径.https://github.com/13leaf/QADDroid
三、下面晾一点代码给大家看看:
package com.qad.demo.inject;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.qad.annotation.InjectPreference;
import com.qad.annotation.InjectResource;
import com.qad.annotation.InjectSystemService;
import com.qad.annotation.InjectView;
import com.qad.app.BaseActivity;
import com.qad.demo.R.id;
import com.qad.demo.R.layout;
import com.qad.demo.R.string;
import com.qad.demo.net.DownLoadDemo;
import com.qad.util.NotificationBuilder;
public class InjectActivity extends BaseActivity {
//inject resource
@InjectResource(id=string.hello) String helloText;
//inject views
@InjectView(id=id.inject_button) Button injectedButton;
@InjectView(id=id.inject_textview) TextView injectedTextView;
//inject system service
@InjectSystemService(name=LAYOUT_INFLATER_SERVICE)
LayoutInflater inflater;
@InjectSystemService(name=NOTIFICATION_SERVICE)
NotificationManager notificationManager;
//we can inject preference by key's name string
@InjectPreference(name="first")
String firstName;
//or we can inject preference by key's resource id
@InjectPreference(id=string.key_second)
String secondName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showMessage("injectPreference:"+firstName+" "+secondName);
Notification notification=buildNotification();
notificationManager.notify(1, notification);
//system Service is first injected
View contentView=inflater.inflate(layout.inject_view_demo, null);
setContentView(contentView);
//auto inject view complete
injectedTextView.setText("I have been injected");
injectedButton.setText("Click Me!");
injectedButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showMessage("hello resource is "+helloText);
}
});
}
private Notification buildNotification() {
PendingIntent pendingIntent=
PendingIntent.getActivity(this, 0, new Intent(this,DownLoadDemo.class), 0);
PendingIntent deleteIntent=
PendingIntent.getActivity(this, 0, new Intent(this,QadSetting.class), 0);
return new NotificationBuilder(this)
.setTicker("Inject ok!")
.setContentTitle("Inject Activity")
.setContentText("InjectView will done after setContentView")
// .setSmallIcon(drawable.default_thumb)
.setOnlyAlertOnce(true)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setDeleteIntent(deleteIntent)
.getNotification();
}
}
由于NotificationBuilder是3.0版才开始的.于是烦躁的楼主自己写了个兼容到1.6的NotificationBuilder...
package com.qad.demo.loader;
import java.io.File;
import java.util.Random;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import com.qad.app.BaseActivity;
import com.qad.loader.ImageLoader;
import com.qad.loader.service.LoadServices;
public class Loader1 extends BaseActivity {
File cacheFolder = new File(Environment.getExternalStorageDirectory(),
"qad/cache");
ImageLoader loader;
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loader=new ImageLoader(
LoadServices.newHttpImage2Cache(cacheFolder,this));
imageView=new ImageView(this);
loader.startLoading(getNextImage(),imageView);
setContentView(imageView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("换一张");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
loader.startLoading(getNextImage(),imageView);
showMessage("载入中..请等待");
return super.onOptionsItemSelected(item);
}
@Override
protected void onDestroy() {
super.onDestroy();
loader.destroy(false);//释放loader。这将杀死loader的后台线程
}
public String getNextImage()
{
if(currentImage==null){
currentImage=images[random.nextInt(images.length)];
}else {
String temp=currentImage;
while(temp.equals(currentImage))
{
currentImage=images[random.nextInt(images.length)];
}
}
return currentImage;
}
Random random=new Random();
String currentImage;
String[] images={
"http://png-1.findicons.com/files//icons/374/shiny_smiley/128/happy.png",
"http://png-4.findicons.com/files//icons/1943/yazoo_smilies/128/smile.png",
"http://png-5.findicons.com/files//icons/1786/oxygen_refit/128/face_smile.png",
"http://png-1.findicons.com/files//icons/2198/dark_glass/128/emoticon.png",
"http://png-4.findicons.com/files//icons/360/emoticons/128/smile_7.png",
"http://png-1.findicons.com/files//icons/350/aqua_smiles/128/fun.png",
"http://png-5.findicons.com/files//icons/2015/24x24_free_application/24/smile.png",
"http://png-2.findicons.com/files//icons/360/emoticons/128/happy.png",
"http://png-5.findicons.com/files//icons/360/emoticons/128/smile_4.png",
"http://png-4.findicons.com/files//icons/2166/oxygen/22/face_smile.png",
"http://png-5.findicons.com/files//icons/753/gnome_desktop/64/gnome_face_smile.png",
"http://png-5.findicons.com/files//icons/408/vista_halloween/128/smile.png",
"http://png-1.findicons.com/files//icons/350/aqua_smiles/128/happy.png",
"http://png-5.findicons.com/files//icons/376/the_blacy/128/big_smile.png",
"http://png-3.findicons.com/files//icons/1943/yazoo_smilies/128/big_smile.png",
"http://png-1.findicons.com/files//icons/2198/dark_glass/128/presence_offline.png",
"http://png-3.findicons.com/files//icons/360/emoticons/128/ok.png",
"http://png-2.findicons.com/files//icons/360/emoticons/128/smile_1.png",
"http://png-3.findicons.com/files//icons/1786/oxygen_refit/128/face_gearhead_male_smile.png",
"http://png-3.findicons.com/files//icons/360/emoticons/128/glad.png",
"http://png-2.findicons.com/files//icons/2023/standard_smile/48/smile.png",
"http://png-4.findicons.com/files//icons/2192/flavour_extended/48/emote_smile.png",
"http://png-1.findicons.com/files//icons/238/santa_claus/128/happy_santaclaus.png",
"http://png-4.findicons.com/files//icons/1035/human_o2/128/face_smile.png"
};
}
ImageLoader继承自QueueLoader.启用的是单线程,队列任务的模型.
注意LoadServices工厂生成了包含二级缓存的LoadService(内存+持久),执行载入任务时将会有缓存策略。详细策略
下次会说明
贴个图:
package com.qad.demo.render;
import com.qad.render.Render;
import com.qad.render.RenderType;
public class RenderEntitiy2 {
public RenderEntitiy2(String thumb, String title, String updateTime,
String content) {
super();
this.thumb = thumb;
this.title = title;
this.updateTime = updateTime;
this.content = content;
}
@Render(type=RenderType.image)
private String thumb;
@Render
private String title;
@Render
private String updateTime;
@Render
private String content;
public String getThumb() {
return thumb;
}
public void setThumb(String thumb) {
this.thumb = thumb;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
package com.qad.demo.render;
import java.util.ArrayList;
import android.os.Bundle;
import com.qad.app.BaseListActivity;
import com.qad.demo.R.drawable;
import com.qad.demo.R.layout;
import com.qad.loader.ImageLoader;
import com.qad.loader.service.LoadServices;
import com.qad.render.RenderEngine;
public class Render2 extends BaseListActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayList<RenderEntitiy2> entities=buildEntities();
RenderEngine.render(getListView(), layout.render2, entities,new ImageLoader(LoadServices.newHttpImageNoCache(me),getResources().getDrawable(drawable.icon)),null);
}
private ArrayList<RenderEntitiy2> buildEntities() {
ArrayList<RenderEntitiy2> entities=new ArrayList<RenderEntitiy2>();
entities.add(new RenderEntitiy2("", "德国14岁少年校园开枪射击 操场与警方对峙", "2012-05-23 11:16:00", "德国警方逮捕一名在校园内开枪射击的14岁少年。中新网5月23日电据外电报道,德国巴伐利亚州梅明根市一名14岁少年22日在校园内持枪射击,后遭到警方逮捕。据悉,该男孩当时在学校的操场内与警方对峙,还将枪指向自己威胁要自杀。报"));
entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y1.ifengimg.com/news_spider/dci_2012/05/2752bf82d2c00a60b5a7f4349ae38ba5.jpg&w=100&h=-1&v=202f8241d0&r=1", "陈水扁戒护就医结束 医生:血块不是恶性肿瘤", "2012-05-23 15:03:00", "资料图:陈水扁。中新网5月23日电据台湾“中广新闻”报道,陈水扁今天(23日)前往林口长庚医院戒护就医,在中午诊疗结束,随后戒护返回台北监狱,受委托前往关心的台大医院柯文哲医生表示,有一些心血管阻塞的现象,不过还没有到临床上有生"));
entities.add(new RenderEntitiy2("", "广东广电局副局长:广电总局从来没有发过限娱令", "2012-05-23 15:55:37", "羊城晚报讯记者刘玮宁、通讯员陈燕舒、实习生秦雪星报道:22日上午,记者从广东省广电局上线省政风行风热线节目“民声热线”中了解到,2011年,广东省广播电影电视局受理观众对在境外电视节目中违规插播广告的投诉有253件。对此,有关负责人表示"));
entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y3.ifengimg.com/7b28ede2da65d6e2/2012/0523/ori_4fbc9c0a5dcfd.jpeg&w=100&h=-1&v=15d34ccc55&r=1", "专家:水中含雌激素不奇怪 没必要担心", "2012-05-23 16:14:48", "漫画/陈春鸣据新华社电日前,一条称“自来水中含有避孕药”的微博引起网民热议。相关领域专家告诉记者,所谓“避孕药”的说法实属噱头,其实准确的说法应该是水里检测出雌激素成分。据专家解释,在合格水质下,雌激素的含量比较微量,不会对"));
entities.add(new RenderEntitiy2("", "长江流域进入汛期 海事部门严防船舶触礁搁浅", "2012-05-23 12:04:00", "宜昌港停泊囤船巳加长“跳船”应对水位上涨。 望作信 摄中新网宜昌5月23日电(望作信李麟)受近期长江流域连续强降雨和上游及各支流来水增多的双重影响,长江重庆至上海,各主要港口相继告别枯水位,长江干线结束长达七个月的枯水期,长江流"));
entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y1.ifengimg.com/news_spider/dci_2012/05/df48952462d1797b0b45decef5a9c7fd.jpg&w=100&h=-1&v=557e2dbaa2&r=1", "英一硕士投简历逾万次未果 背广告牌推销自己", "2012-05-23 14:41:46", "英国硕士罗宾·诺顿背广告牌推销自己(网页截图) 国际在线专稿:据英国《每日邮报》5月22日报道,英国一位硕士过去十年间投简历1.5万份,但却没有找到一份全职工作。他目前整天背着广告牌沿着公路行走,希望能够找到工作。这名硕士叫"));
entities.add(new RenderEntitiy2("", "张弛:“是中国人就转”的话语困境", "2012-05-23 13:57:42", "网上总有一些话,能让人看后长吁短叹又忍俊不禁,比如出镜率极高的“是中国人的就转”,又或者是它的孪生兄弟“不转不是中国人”。每每看到这句话,我在未点击鼠标左键之后都要掏出身份证来确认一下,看看它背后的“中华人民共和国”会不会易名改姓。只是"));
entities.add(new RenderEntitiy2("", "以色列防长称以仍未排除军事打击伊朗可能性", "2012-05-23 13:57:00", "中新网5月23日电据外媒报道,以色列国防部长巴拉克23日表示,伊朗与国际原子能机构达成的开放核设施的初步协议,并不能让以色列排除军事打击伊朗的可能。巴拉克说,他对伊朗与国际原子能机构达成的这一初步协议“持怀疑态度”,认为这一协议不过是伊"));
entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y1.ifengimg.com/1b0c4ed4543066da/2012/0523/ori_4fbc5737d7df0.jpeg&w=100&h=-1&v=6a6263212f&r=1", "李克峰:那一年,我读列夫·托尔斯泰", "2012-05-23 11:20:33", "1983年,我是学生,托尔斯泰是书架上的藏书。当时,没有酒吧、歌舞厅和洗脚城。从军队或农村回京的青年,骑自行车到消息灵通人士家里泡着,谈“人家美国……”,那叫沙龙。大家可以拎着烧开水的大铝壶,到饭馆去打1块4毛钱1斤的散装啤酒喝,但"));
entities.add(new RenderEntitiy2("", "印度一公交车冲进恒河致26人死亡 系超载失控", "2012-05-23 15:19:00", "中新网5月23日电据外媒报道,印度警方透露,一辆公交车当地时间22日晚间冲进恒河,造成26人死亡,另有4人受重伤。救援人员已经在河中工作超过4个小时搜寻失踪者以及遇难者遗体。当地警方透露,这辆公交车载有45人,在开往圣城里希盖什的路"));
entities.add(new RenderEntitiy2("", "奥巴马称卡梅伦在北约峰会期间曾偷溜外出观光", "2012-05-23 13:05:58", "5月21日,美国总统奥巴马(前右)和英国首相卡梅伦(前左)出席北约峰会阿富汗会议(新华社)国际在线专稿:据英国《每日邮报》5月22日报道,美国总统奥巴马(BarackObama)日前曝光称,英国首相卡梅伦(DavidCamero"));
entities.add(new RenderEntitiy2("http://res01.mimg.ifeng.com/g?url=http://y0.ifengimg.com/news_spider/dci_2012/05/8baed005fac3fc57d07354a5101d2a7f.jpg&w=100&h=-1&v=e702ebc3b4&r=1", "伦敦奥运门票即将开售 开幕式最高票价2012英镑", "2012-05-23 13:38:00", "伦敦奥运门票图样(图片来源:黑龙江日报)中广网北京5月22日消息据中国之声《全球华语广播网》报道,因为是在本土举办,英国人今年看奥运的热情空前高涨。不过,伦敦奥运会的门票现在是又贵又难买,看开幕式最贵门票合人民币2万多,要知道4年"));
return entities;
}
}
没有用Adapter,就出来了一个简易的列表噢.