原文出自:方杰| 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要实现的接口。

 欢迎各位关注我的个人网站:http://fangjie.sinaapp.com/ 

Android新浪微博client(一)——主框架搭建的更多相关文章

  1. 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)

    android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比  转载请注明http://w ...

  2. 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment

    仿百度壁纸客户端(一)--主框架搭建,自定义Tab+ViewPager+Fragment 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2 ...

  4. Android新浪微博客户端(一)——主框架搭建

    原文出自:方杰| http://fangjie.info/?p=62 转载请注明出处 提前声明的是,我是按照Ivan的这套教程学下来的. 首先,对于任何应用我们都需要建立一套消息处理机制,就是当用户在 ...

  5. 【一】Swift 3.0 新浪微博项目实战 -整体框架搭建

    最近要接手swift,所以找了个视频跟着做一下实战项目,在此记录一下过程和心得 框架搭建和目录拆分 关键词:MVVM 架构,桥接文件 桥接文件用于引入OC的头文件,Swift就可以正常使用(宏除外). ...

  6. Android新浪微博client(七)——ListView图片异步加载、高速缓存

    原文出自:方杰|p=193" style="color:rgb(202,0,0); text-decoration:none; font-size:14px; font-famil ...

  7. iOS 新浪微博-1.0框架搭建

    项目搭建 1.新建一个微博的项目,去掉屏幕旋转 2.设置屏幕方向-->只有竖向 3.使用代码构建UI,不使用storyboard 4.配置图标AppIcon和LaunchImage 将微博资料的 ...

  8. 主框架搭建demo

    - (void)viewDidLoad {     [super viewDidLoad];        [self setUpAllChildViewController]; }    /**   ...

  9. Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美

    Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...

随机推荐

  1. 中矿大 C 石头剪刀布【决策DP*待看/codeforces原题】

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 齐齐和司机正在玩剪刀石头布,不过他俩有些玩腻了,所 ...

  2. HDU1016 Prime Ring Problem (回溯 + 剪枝)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398684.html 题意: 给你一个数字N(N <= 20),要求你把这N个数组成一个环,环内的数字不能重复,左右 ...

  3. hiho一下第131周 后缀自动机二·重复旋律8(循环相似子串)

    后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi ...

  4. view hex value in MR

    cat filename | hexdump  –C tail  -行数 filename | hexdump  –C head -行数 filename | hexdump -C

  5. [BZOJ 1567] Blue Mary的战役地图

    Link: BZOJ 1567 传送门 Solution: 矩阵Hash/二维$Hash$模板题 涉及到需要快速查询.匹配的题目,考虑直接上$Hash$ 矩阵$Hash$其实就是每行先各$Hash$一 ...

  6. 用字符串连接SQL语句并用EXEC执行时,出现名称 '‘不是有效的标识符

    原文:用字符串连接SQL语句并用EXEC执行时,出现名称 ''不是有效的标识符 用字符串连接SQL语句并用EXEC执行时,出现名称 '这里是字符串连接的一条SQL语句‘不是有效的标识符 才发现,在写e ...

  7. Overview of iOS Crash Reporting Tools: Part 2/2

    Thanks for joining me for the second part of this two-part series on crash reporting services! The f ...

  8. ubuntu 下安装nodejs以及pm2

    ubuntu 12.04服务器可以使用apt-get方式安装Node JS,但是,安装完后的版本为v0.6.12的版本,如果我们想要使用新一点的版本需要做如下配置: 1 2 3 4 apt-get i ...

  9. 设计模式之工厂模式之工厂方法(php实现)

    github: git@github.com:ZQCard/design_pattern.git /** * 工厂方法 * 使用开闭原则来分析下工厂方法模式.当有新的产品产生时,只要按照抽象产品角色. ...

  10. 2. LVS/DR 配置

    平台:RedHat Enterprise Linux centos6.3       ipvsadm             ipvs 1.DR模型 DR模型:直接路由模型,每个Real Server ...