Android新浪微博client(一)——主框架搭建
原文出自:方杰| http://fangjie.sinaapp.com/?p=62 转载请注明出处
该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo
提前声明的是,我是依照Ivan的这套教程学下来的。
首先,对于不论什么应用我们都须要建立一套消息处理机制,就是当用户在UI界面上点击了什么。你应该做出什么样的处理,处理完毕之后又要将结果 反馈给用户。显示在UI界面上。简而言之:主框架在这里主要是搭建起一个异步消息处理机制,UI线程中发送消息,service处理消息。处理完了调用UI线程实例更新UI界面。
先看看这里是怎么处理的,例如以下图:
解析:在程序启动时开启MainService。MainService中新开个线程来不断循环的监听Tasks中是否有任务。
当UI界面的主线程接收到用户的某个操作时。就会调用MainService.newTask()将这个任务放进Tasks中。而且把Activity放进Activities。
这样在MainService中的第二线程就会监听到这个任务,就会调用MainService.doTask(),当做完处理后MainService第二线程就会向MainService主线程发送Handler消息,将处理得一些数据发送到Acitivity中,然后调用的Activity.refresh()就能刷新页面了。这里要强调的是UI层的Activity都要实现IWeiboActivity这样一个接口。实现他的refresh(),init()两个抽象方法。
MainService.java
package com.fangjie.weibo.logic;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import android.app.Activity;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.util.Log;
import com.fangjie.weibo.bean.*;
import com.fangjie.weibo.db.DBUserInfo;
import com.fangjie.weibo.ui.IWeiboAcitivity;
import com.fangjie.weibo.util.GetUserInfo;
import com.weibo.sdk.android.Oauth2AccessToken; public class MainService extends Service implements Runnable{ private static Queue<Task> tasks=new LinkedList<Task>();
private static ArrayList<Activity> appActivities=new ArrayList<Activity>();
private boolean isRun;
private Handler handler; @Override
public void onCreate() {
// TODO Auto-generated method stub
/**
* 在MainService中开启第二线程来处理任务
* 主要是不断监听Tasks堆栈,从Tasks中处理task
*/
isRun=true;
Thread thread =new Thread(this);
thread.start();
super.onCreate(); /**
* 主要是获取从MainService第二线程(doTask)中获取处理完任务的数据
* 并通知更新UI界面
*/
handler =new Handler(){
public void handleMessage(Message msg)
{
IWeiboAcitivity activity=null;
switch(msg.what)
{
case Task.WEIBO_LOGIN:
activity=(IWeiboAcitivity)getActivityByName("LoginActivity");
activity.refresh(Task.WEIBO_LOGIN,msg.obj);
break;
case Task.GET_USERINFO_BY_TOKEN: break; case Task.GET_USERINFO_IN_LOGIN: break;
default:
break;
}
}
}; } @Override
public void run() {
// TODO Auto-generated method stub
while(isRun)
{
if(!tasks.isEmpty())
{
doTask(tasks.poll());
}
}
} /**
* UI层向MainService中发送任务task
* UI层调用,所以static
* @param task
*/
public static void newTask(Task task)
{
tasks.add(task);
} /**
* UI层向MainService中发送任务的同一时候。相同要发送自己Activity,
* 以便在MainService中调用refresh();
* @param task
*/
public static void addActivty(Activity activity)
{
appActivities.add(activity);
}
/**
* UI层中有向MainService中传递Activity,在任务结束后(refresh)。应去除该Activity,防止混淆! * @param activity
*/
public static void reMoveActivty(Activity activity)
{
appActivities.remove(activity);
} /**
* 通过name获取新开任务时传递过来的Activity实例
* @param name
* @return
*/
public Activity getActivityByName(String name)
{
if(!appActivities.isEmpty())
{
for(Activity activity:appActivities)
{
if(activity.getClass().getName().indexOf(name)>0)
{
return activity;
}
}
}
return null;
} /**
* 处理Tasks堆栈中的task
* @param task
*/
public void doTask(Task task)
{
Message msg=handler.obtainMessage();
msg.what=task.getTaskID(); switch(task.getTaskID())
{
//登录操作
case Task.WEIBO_LOGIN:
System.out.println("login successful");
msg.obj="登录成功";
break; //通过access_token获取用户信息,并保存到数据库操作
case Task.GET_USERINFO_BY_TOKEN:
msg.obj="成功";
break; //登录界面获取用户信息显示操作
case Task.GET_USERINFO_IN_LOGIN:
msg.obj="成功";
break;
default :
break;
}
handler.sendMessage(msg);
} @Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
再看看我的project文件架构,例如以下图:
Task.java是任务的实体类,包括任务的ID。任务的參数成员变量,IWeiboActivity就是全部Activity要实现的接口。
Android新浪微博client(一)——主框架搭建的更多相关文章
- 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)
android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比 转载请注明http://w ...
- 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment
仿百度壁纸客户端(一)--主框架搭建,自定义Tab+ViewPager+Fragment 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- Android新浪微博客户端(一)——主框架搭建
原文出自:方杰| http://fangjie.info/?p=62 转载请注明出处 提前声明的是,我是按照Ivan的这套教程学下来的. 首先,对于任何应用我们都需要建立一套消息处理机制,就是当用户在 ...
- 【一】Swift 3.0 新浪微博项目实战 -整体框架搭建
最近要接手swift,所以找了个视频跟着做一下实战项目,在此记录一下过程和心得 框架搭建和目录拆分 关键词:MVVM 架构,桥接文件 桥接文件用于引入OC的头文件,Swift就可以正常使用(宏除外). ...
- Android新浪微博client(七)——ListView图片异步加载、高速缓存
原文出自:方杰|p=193" style="color:rgb(202,0,0); text-decoration:none; font-size:14px; font-famil ...
- iOS 新浪微博-1.0框架搭建
项目搭建 1.新建一个微博的项目,去掉屏幕旋转 2.设置屏幕方向-->只有竖向 3.使用代码构建UI,不使用storyboard 4.配置图标AppIcon和LaunchImage 将微博资料的 ...
- 主框架搭建demo
- (void)viewDidLoad { [super viewDidLoad]; [self setUpAllChildViewController]; } /** ...
- Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美
Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...
随机推荐
- 网盘+SVN
1.安装网盘 选择一个国内有名的网盘存储,例如金山网盘.360云盘等,注册账户会默认赠送几G的使用空间,然后下载其对应的网盘客户端管理软件(也可以使用浏览器方式),使用账号登录,就可以上传.管理文件等 ...
- windows7_64位安装sql_server_2000成功
对于4合一的版本来说只要找到安装包里的 STANDARD.PERSONAL.ENTERPRISE.DEVELOPER文件夹下的 X86\SETUP\SETUPSQL.EXE 任何一个运行即可,(理论上 ...
- Ubuntu14.04配置VIM与GVIM 高亮、跳转与变量函数列表
一.环境:刚安装好的Ubuntu14.04,本文只能保证 在Ubuntu下能达到效果. 二.安装GVim. sudo apt-get update sudo apt-get install vim-g ...
- laravel 安装碰到的问题:全局安装 Laravel Installer,然后用下面的指令创建新项目: laravel new blog报连接超时解决方案
在执行laravel new project 的时候报错 cURL error 7: Failed to connect to cabinet.laravel.com port 80: Timed o ...
- mysql查询含有指定字段的所有表
SELECT * FROM information_schema.columns WHERE column_name='userId'; TABLE_SCHEMA字段为db的名称(所属的数据库),字段 ...
- Web/JAVA 简单题目汇总
[Java标识符,变量.常量] 一.Java合法标识符命名规则 (1)区分字母大小写,标识符长度不限 (2) 英文,Unicode码双字节文字字符(日文,韩文,中文),数字,下划线,$(美元符号)均 ...
- Memcache的mutex设计模式 -- 高并发解决方案
场景 Mutex主要用于有大量并发访问并存在cache过期的场合,如 首页top 10, 由数据库加载到memcache缓存n分钟: 微博中名人的content cache, 一旦不存在会大量请求不能 ...
- DBS:同学录
ylbtech-DatabaseDesgin:ylbtech-cnblogs(博客园)-数据库设计-2,Admin(用户后台) DatabaseName:同学录 Model: Type: Url: 1 ...
- C中存储分区详解
一. 在c中分为这几个存储区:栈(stack),堆(heap),代码段(text),数据段(data),bss 段,常量存储区,1.栈(stack):由编译器自动分配释放自动分配,自动回收:栈区里面存 ...
- selenium实现失败重运行
UI自动化脚本执行过程中存在非常多的不稳定性,例如网络的不稳定,浏览器无响应等等,这些失败往往并不是产品中的错误.那么这时我们往往需要对执行失败的测试用例进行多次重跑,确认其是否确实失败. 那么失败重 ...