原文出自:方杰| 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. EntityFramework之多对多关系(四)

    上篇介绍了一对多关系,下面介绍下多对多关系代码编写. 1.新建model实体,User是用户类,Role是角色类,由于是多对多关系,必须得有一个中间类,所以产生了UserRole类 public cl ...

  2. JavaScript 开发者的 10 款必备工具

    JavaScript,一种所有主流浏览器都支持的语言,是开发基于浏览器的 Web 应用程序的主力,几乎每年都会受到来自众多开发人员的关注.自然地,框架和库的生态系统自然而然地围绕着 JavaScrip ...

  3. Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法

    静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...

  4. python 设计模式之中介模式

    Mediator Pattern:中介模式 中介模式提供了一系列统一的系统接口.此模式也被认为是行为模式,因为他能选择程序处理流程.  当许多类开始在交互中产生结果时,可以选用中介模式.当软件开始组织 ...

  5. linux下批量更改一个目下的目录和文件的权限

    对于网站目录我们一般设置目录的权限是755, 而文件的权限是644  ,上传目录另设 比如我们要设置web目录下的所有目录的权限是755,文件的目录是644,那么我们可以批量修改吗?答案是肯定的, 就 ...

  6. kaptcha验证码

    @Action("/validimg") public String validimg() throws Exception { genernateCaptchaImage(); ...

  7. NSOperationQueue 和 NSOperation

    The NSOperationQueue class regulates the execution of a set of NSOperation objects. After being adde ...

  8. Linux下的权限问题

    刚刚经理给我讲了有关权限的问题,后自己也在网上收集整理了下,特记于此. ---------------------------------------------------------------- ...

  9. C++之纯虚函数

    1. 纯虚函数形式 class Parent { public: ; }; 代码中的func1就是纯虚函数,没有函数体,没有函数的具体实现,有virtual,在函数名后面带有“ = 0”形式: 2.对 ...

  10. .net开发常用的第三方开发组件

    转自:http://www.cnblogs.com/damsoft/p/6100323.html .net开发常用的第三方组件: 1.RSS.NET.dll: RSS.NET是一款操作RSS feed ...