zoukankan      html  css  js  c++  java
  • Android新浪微博client(一)——主框架搭建

    原文出自:方杰| 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/ 
  • 相关阅读:
    python __builtins__ set类 (60)
    python __builtins__ reversed类 (58)
    python __builtins__ range类 (56)
    python __builtins__ property类 (55)
    python __builtins__ memoryview类 (46)
    python __builtins__ map类 (44)
    python __builtins__ list类 (42)
    python __builtins__ license类 (41)
    (转)面试算法总结
    (Mark)JS中的上下文
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6789035.html
Copyright © 2011-2022 走看看