Android新浪微博客户端(一)——主框架搭建
原文出自:方杰| http://fangjie.info/?p=62 转载请注明出处
提前声明的是,我是按照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;
}
}
再看看我的工程文件架构,如下图:

Task.java是任务的实体类,包含任务的ID,任务的参数成员变量,IWeiboActivity就是所有Activity要实现的接口。
Android新浪微博客户端(一)——主框架搭建的更多相关文章
- 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)
android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比 转载请注明http://w ...
- 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment
仿百度壁纸客户端(一)--主框架搭建,自定义Tab+ViewPager+Fragment 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment ...
- android 新浪微博客户端的表情功能的实现
这是一篇好文章,我转来收藏,技术的最高境界是分享. 最近在搞android 新浪微博客户端,有一些心得分享弄android客户端表情功能可以用以下思路1.首页把新浪的表情下载到本地一文件夹种,表情图片 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- Android新浪微博client(一)——主框架搭建
原文出自:方杰| http://fangjie.sinaapp.com/?p=62 转载请注明出处 该项目代码已经放到github:https://github.com/JayFang1993/Sin ...
- Android新浪微博客户端(四)——添加多个账户及认证
原文出自:方杰| http://fangjie.info/?p=75转载请注明出处 二.获取用户信息并保存数据库 上面说到加载AuthActivity有两种情况,其中一种就是授权成功回调,在授权回调成 ...
- Android新浪微博客户端(三)——添加多个账户及认证
原文出自:方杰|http://fangjie.info/?p=72 转载请注明出处 一.微博OAuth2.0认证 首先来说说授权过程,我这里授权是通过SDK的,先添加SDK的jar包,微博SDK的de ...
- 【一】Swift 3.0 新浪微博项目实战 -整体框架搭建
最近要接手swift,所以找了个视频跟着做一下实战项目,在此记录一下过程和心得 框架搭建和目录拆分 关键词:MVVM 架构,桥接文件 桥接文件用于引入OC的头文件,Swift就可以正常使用(宏除外). ...
- Android新浪微博客户端(二)——添加多个账户及认证
原文出自:方杰| http://fangjie.info/?p=69 转载请注明出处 先看下实现效果: 欢迎界面: 第一次进入登录界面登录由于在登录界面没有已授权用户信息,所以自动跳转到授权界面. ...
随机推荐
- Lucene和jackson冲突
今天在使用lucene的时候,想直接在Controller中返回json对象,于是在Spring中配置了JackSon的converter: <bean id="jacksonMess ...
- Android TabActivity之感叹
(一)前言 在以前一篇帖子讲ams的时候,提了一下TabActivity.当时说它比较特殊就没有下文了,今天重发一篇帖子,跟大家探讨一下TabActivity. 做个假定先: 比如我们最外面的Acti ...
- 1629 - Cake slicing(DP)
花了近2个小时终于AC,好爽.. 一道类似于最优矩阵链乘的题目,受<切木棍>那道题的启示,该题的原理也是一样的,仅仅只是变成了且面积.那么对应的也要添加维度 . 显然要完整的表示状态,最少 ...
- OleDb 读取 excel
//定义变量 _Application ExcelApp; Workbooks wbsMyBooks; _Workbook wbMyBook; Worksheets wssMysheets; _Wor ...
- WCF的回调使用实例代码说明
很多时候我们会遇到,信息及时推送通知的情况,例如:监控设备时及时推送状态.报警信息等,我们就可以用WCF的回调机制来实现,下面以一个监控设备名字为例,如果设备名字发生改变,服务器就马上推送消息给客户端 ...
- Spring MVC中使用Mongodb总结
近期项目做了次架构调整,原来是使用MySQL+GeoHash来存储LBS数据(地理位置信息),现在使用NOSQL数据库MongoDB来存储LBS数据(地理位置信息).由于项目是基于spring MVC ...
- codevs 1173 最优贸易(DP+SPFA运用)
/* 中国的题目 ——贱买贵卖 0.0 这题wa了好多遍 第一遍看着题 哎呀这不很简单嘛 从起点能到的点都是合法的点 然后统计合法的点里最大最小值 然后printf 也不知道哪里来的自信 就这么交了 ...
- JavaScript 浮点数运算 精度问题
JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,先请看下面脚本. //加减 <script type="text/javascript" lan ...
- Avast注册以及更新
昨天无聊在网上看Avast,然后下了玩. Avast有三种版本,免费版,网络版,高级版. 下了个高级版,在贴吧和论坛找激活码,发现大部分都没用,最后找了一个许可文件 关于Avast的注册,有在线和离线 ...
- hdu 2105
#include <iostream> #include <stdio.h> using namespace std; int main() { double a,b,c,d, ...