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

最新文章

  1. 笔记:Binder通信机制
  2. 利用HTML5 的Datalist 元素实现输入提示
  3. Easyui Ajax验证Form表单。。。
  4. Shortest Palindrome
  5. hdu 1279 验证角谷猜想
  6. 误删dpkg的/var/lib/dpkg/info文件夹的解决办法 zhuan
  7. Python_cmd的各种实现方法及优劣(subprocess.Popen, os.system和commands.getstatusoutput)
  8. cron 配置计划任务的书写格式(quartz 时间配置)
  9. http请求的referer属性
  10. Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法
  11. json 帮助工具
  12. 分享一波eclipse常用快捷键
  13. 51Nod 1289 大鱼吃小鱼(模拟,经典好题)
  14. [UWP]新控件ColorPicker
  15. [curl]convert curl to python Ruby
  16. 6354 Everything Has Changed
  17. JdbcTemplate 配置多数据源(完全照抄,完整)
  18. kong+konga
  19. BAT-批量改文件后缀名
  20. http://browniefed.com/blog/2015/09/10/the-shapes-of-react-native/

热门文章

  1. Windows7 64位系统搭建Cocos2d-x 2.2.1最新版以及Android交叉编译环境(具体教程)
  2. Counting Lines, Words, and Characters with wc
  3. block为什么要用copy,runtime的简单使用
  4. 补间动画 Interpolator 简介 示例
  5. web04--cookie
  6. 5、第5节课CSS补充和html 标签讲解20150924
  7. ASP.NET-FineUI开发实践-4
  8. Html.RenderPartial与Html.RenderAction区别(转)
  9. MYSQL数据库命名与其设计规范
  10. OC之字符串 NSString与NSMutableString