原文出自:方杰| 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. 错误处理:java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEachTag

    在使用JSP.Servlet进行开发时,遇到java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEac ...

  2. JavaScript 总结

    1. JavaScript prototype属性是一个对象 当一个函数在定义之后 就会自动获得这个属性.其初始值是一个空对象.新建了一个名为Cat的构造函数,其prototype为一个对象,cons ...

  3. Python 的数据类型

    列表 #coding=utf-8 students=["小明","小华","小李","小娟","小云" ...

  4. 关于IIS部署成功后,局域网其他用户无法访问的问题解决方法

    关于win7部署iis后,局域网的其他用户不能访问的问题.   在win7系统中,部署好iis后,自己本地可以发布和预览.但在局域网中的其他用户不可以访问.下面说一下这个原因. 这是因为win7自带的 ...

  5. java里面List和Array的区别是什么?

    java里面的List和Array的区别是什么? 1:数组是定长,list是自动增长.2:数组效率高,list效率低.总结:数组牺牲功能增加效率,list牺牲效率增加功能. http://bbs.cs ...

  6. 原生js 学习之array 数组

    Array的原生方法:  concat(): 连接两个或更多的数组哦 join(): 把数组的所有元素放在一个字符串中 pop():删除并返回数组的最后一个元素 push():向数组的末尾添加一个元素 ...

  7. zookeeper集群的安装

    顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员, Apache Hbase和 Apache Solr 的分布式集群都用到了zook ...

  8. gc内存回收机制

    判断哪些对象可回收 GC是通过对象是否存活来决定是否进行回收,判断对象是否存活主要有两种算法:引用计数算法.可达性分析算法 引用计数算法 引用计数的算法原理是给对象添加一个引用计数器,每被引用一次计数 ...

  9. FTP链接mac

    mac下一般用smb服务来进行远程文件访问,但要用FTP的话,高版本的mac os默认关掉了,可以用如下命令打开: sudo -s launchctl load -w /System/Library/ ...

  10. 武汉科技大学ACM :1008: A+B for Input-Output Practice (VIII)

    Problem Description Your task is to calculate the sum of some integers. Input Input contains an inte ...