原文出自:方杰| 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新浪微博客户端(一)——主框架搭建的更多相关文章

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

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

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

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

  3. android 新浪微博客户端的表情功能的实现

    这是一篇好文章,我转来收藏,技术的最高境界是分享. 最近在搞android 新浪微博客户端,有一些心得分享弄android客户端表情功能可以用以下思路1.首页把新浪的表情下载到本地一文件夹种,表情图片 ...

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

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

  5. Android新浪微博client(一)——主框架搭建

    原文出自:方杰| http://fangjie.sinaapp.com/?p=62 转载请注明出处 该项目代码已经放到github:https://github.com/JayFang1993/Sin ...

  6. Android新浪微博客户端(四)——添加多个账户及认证

    原文出自:方杰| http://fangjie.info/?p=75转载请注明出处 二.获取用户信息并保存数据库 上面说到加载AuthActivity有两种情况,其中一种就是授权成功回调,在授权回调成 ...

  7. Android新浪微博客户端(三)——添加多个账户及认证

    原文出自:方杰|http://fangjie.info/?p=72 转载请注明出处 一.微博OAuth2.0认证 首先来说说授权过程,我这里授权是通过SDK的,先添加SDK的jar包,微博SDK的de ...

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

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

  9. Android新浪微博客户端(二)——添加多个账户及认证

    原文出自:方杰| http://fangjie.info/?p=69  转载请注明出处 先看下实现效果: 欢迎界面: 第一次进入登录界面登录由于在登录界面没有已授权用户信息,所以自动跳转到授权界面. ...

随机推荐

  1. [Redux] Implementing Store from Scratch

    Learn how to build a reasonable approximation of the Redux Store in 20 lines. No magic! const counte ...

  2. Linux/UNIX套接字连接

    套接字连接 套接字是一种通信机子.凭借这样的机制.客户/server系统的开发工作既能够在本地单机上进行.也能够夸网络进行. 套接字的创建和使用与管道是有差别的.由于套接字明白地将客户和server区 ...

  3. Can a Tomcat docBase span multiple folders?--转

    Question: I apologize if this is a poor question, but I'm using Windows and looking to see if there' ...

  4. Js实现简单的联动,无数据库版本

    <html> <head> <title></title> <script language="javascript" typ ...

  5. 使用ShareSDK完成Facebook第三方登录和Facebook分享时没办法跳转到Facebook应用

    楼主是通过cocoapod接入ShareSDK, 后来发现无论是使用fb分享还是登录, 都是跳出了网页认证(即使我的手机有安装了fb) 后来mob的技术客服小哥告诉我在构造分享参数的时候, 执行参数字 ...

  6. PHP XML Expat 解析器

    PHP XML Expat 解析器 内建的 Expat 解析器使在 PHP 中处理 XML 文档成为可能. XML 是什么? XML 用于描述数据,其焦点是数据是什么.XML 文件描述了数据的结构. ...

  7. mssql 查询全部用户创建表 条数及占用空间大小(KB)

    select b.name as tablename , --表名a.rowcnt as datacount,   --条数rtrim(8*a.dpages) as size  --占用空间单位KBf ...

  8. 你好,C++(21)只要天还没黑,就一直在工地干活-4.3.1 while循环:只要…就一直…

    4.3  循环控制语句 在现实世界中,有这样一类现象: 只要油箱中的当前油量小于油箱容量100升,就一直往油箱中加油: 一直不断地为祖国辛勤工作,只要我还活着: 公司100000位员工,每个人的工资都 ...

  9. iOS开源 框架

    UI界面类项目: Panoramagl ——720全景展示 Panorama viewer library foriPhone, iPad and iPod touch MBProgressHUD — ...

  10. UBUNTU 下设置全局 path变量

    全局的对所有用户都可以的使用的PATH: 可以通过修改配置文件: /etc/bashrc 和 /etc/profile 来时配置, 全局的PATH; 例如: vi /etc/profile 在最后后加 ...