新浪微博Android客户端学习记录二:系统主框架搭建

原文转载:http://blog.csdn.net/yanghai0321/article/details/7528499

  在系列视频的二三四讲中讲了搭建主框架中的UI层(主要为微博中的各个窗体)和Logic层(程序的核心控制调度模块,获取UI传递的数据、要执行的任务,调用微博接口,获得网络数据,返回消息,刷新(切换)UI)。

          Eclipse中代码结构如下图:

      

      Logic层的Mainservice

1、完成程序调度 接收任务,完成业务逻辑,返回信息,更新UI
2、在后台运行(继承自Service类)
3、线程(实现Runnable接口)  不断侦听UI传过来任务消息
  流程关系如图:

  

 MainService代码如下:

[java]  view plain copy
  1. package haiyang.project.iweibo.logic;  
  2.   
  3. import haiyang.project.iweibo.bean.Task;  
  4. import haiyang.project.iweibo.ui.IWeiboActivity;  
  5.   
  6. import java.util.ArrayList;  
  7. import java.util.LinkedList;  
  8. import java.util.Queue;  
  9.   
  10. import android.app.Activity;  
  11. import android.app.Service;  
  12. import android.content.Intent;  
  13. import android.os.Handler;  
  14. import android.os.IBinder;  
  15. import android.os.Message;  
  16.   
  17. public class MainService extends Service implements Runnable {  
  18.   
  19.     //任务队列  
  20.     private static Queue<Task> tasks=new LinkedList<Task>();  
  21.       
  22.     private static ArrayList<Activity> appActivities=new ArrayList<Activity>();  
  23.       
  24.     private boolean isRun;//是否运行线程  
  25.       
  26.     Handler handler=new Handler(){  
  27.         public void handleMessage(android.os.Message msg){  
  28.             switch (msg.what) {  
  29.             case Task.WEIBO_LOGIN://用户登录  
  30.                 //更新UI  
  31.                 IWeiboActivity activity=(IWeiboActivity) getActivityByName("LoginActivity");  
  32.                 activity.refresh(msg.obj);  
  33.                 break;  
  34.   
  35.             default:  
  36.                 break;  
  37.             }  
  38.         };  
  39.     };  
  40.       
  41.     /* 
  42.      * 添加一个Activity对象 
  43.      */  
  44.     public static void addActivity(Activity activity){  
  45.         appActivities.add(activity);  
  46.     }  
  47.       
  48.     /** 
  49.      * 根据Activity的Name获取Activity对象 
  50.      * @param name 
  51.      * @return 
  52.      */  
  53.     private Activity getActivityByName(String name){  
  54.         if(!appActivities.isEmpty()){  
  55.             for(Activity activity:appActivities){  
  56.                 if(activity!=null){  
  57.                     if(activity.getClass().getName().indexOf(name)>0){  
  58.                         return activity;  
  59.                     }  
  60.                 }  
  61.             }  
  62.         }  
  63.         return null;  
  64.     }  
  65.       
  66.     /* 
  67.      * 添加任务到任务队列中 
  68.      */  
  69.     public static void newTask(Task t){  
  70.         tasks.add(t);  
  71.     }  
  72.       
  73.     @Override  
  74.     public void onCreate() {  
  75.           
  76.         isRun=true;  
  77.         Thread thread=new Thread(this);  
  78.         thread.start();  
  79.         super.onCreate();  
  80.     }  
  81.       
  82.     public void run() {  
  83.         while(isRun){  
  84.             Task task=null;  
  85.             if(!tasks.isEmpty()){  
  86.                 task=tasks.poll();//执行完任务后把该任务从队列中移出(否则会一直循环)  
  87.                 if(task!=null){  
  88.                     doTask(task);  
  89.                 }  
  90.             }  
  91.             try {  
  92.                 Thread.sleep(1000);//执行完任务后休息一秒钟  
  93.             } catch (Exception e) {  
  94.   
  95.             }  
  96.         }  
  97.     }  
  98.       
  99.     /* 
  100.      * 处理任务,发回更新消息给主线程 
  101.      */  
  102.     private void doTask(Task t){  
  103.           
  104.         Message msg=handler.obtainMessage();  
  105.         msg.what=t.getTaskId();  
  106.         switch(t.getTaskId()){  
  107.         case Task.WEIBO_LOGIN:  
  108.             System.out.println("doTask >>>>>>>  user login");  
  109.             msg.obj="登录成功";  
  110.             break;  
  111.             default:  
  112.                 break;  
  113.         }  
  114.         handler.sendMessage(msg);  
  115.     }  
  116.   
  117.     @Override  
  118.     public IBinder onBind(Intent arg0) {  
  119.         // TODO Auto-generated method stub  
  120.         return null;  
  121.     }  
  122.   
  123. }  

Logic层的Task 程序中的任务

[java]  view plain copy
  1. package haiyang.project.iweibo.bean;  
  2.   
  3. import java.util.*;  
  4.   
  5. public class Task {  
  6.   
  7.     //任务Id  
  8.     private int taskId;  
  9.     //参数  
  10.     private Map<String,Object> tasKParams;  
  11.       
  12.     //登录  
  13.     public static final int WEIBO_LOGIN=1;  
  14.       
  15.     public Task(int taskId,Map<String,Object> taskParams){  
  16.         this.taskId=taskId;  
  17.         this.tasKParams=taskParams;  
  18.     }  
  19.   
  20.     public int getTaskId() {  
  21.         return taskId;  
  22.     }  
  23.   
  24.     public void setTaskId(int taskId) {  
  25.         this.taskId = taskId;  
  26.     }  
  27.   
  28.     public Map<String, Object> getTasKParams() {  
  29.         return tasKParams;  
  30.     }  
  31.   
  32.     public void setTasKParams(Map<String, Object> tasKParams) {  
  33.         this.tasKParams = tasKParams;  
  34.     }  
  35.       
  36. }  

  IWeiboActivity

 所有的Activity都实现它
  init()  初始化数据
  refresh()刷新UI

[java]  view plain copy
  1. package haiyang.project.iweibo.ui;  
  2.   
  3. /* 
  4.  * Activity接口 
  5.  */  
  6. public interface IWeiboActivity {  
  7.   
  8.     /* 
  9.      * 初始化数据 
  10.      */  
  11.     void init();  
  12.       
  13.     /* 
  14.      * 刷新UI 
  15.      */  
  16.     void refresh(Object... params);  
  17. }  

    此代码实现了由Logo界面到登录的过程,LoginActivity在前面的基础上有变化

[java]  view plain copy
  1. package haiyang.project.iweibo.ui;  
  2.   
  3. import haiyang.project.iweibo.R;  
  4. import haiyang.project.iweibo.bean.Task;  
  5. import haiyang.project.iweibo.logic.MainService;  
  6. import android.app.Activity;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.TextView;  
  13.   
  14. public class LoginActivity extends Activity implements IWeiboActivity{  
  15.       
  16.     private Button btnLogin;  
  17.       
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         // TODO Auto-generated method stub  
  21.         super.onCreate(savedInstanceState);  
  22.         this.setContentView(R.layout.main);  
  23.           
  24.         //启动服务  
  25.         Intent intent=new Intent(this,MainService.class);  
  26.         startService(intent);  
  27.           
  28.         btnLogin=(Button) this.findViewById(R.id.btn_login);  
  29.         btnLogin.setOnClickListener(new OnClickListener(){  
  30.   
  31.             @Override  
  32.             public void onClick(View v) {  
  33.                 Task task=new Task(Task.WEIBO_LOGIN,null);  
  34.                 MainService.newTask(task);  
  35.             }  
  36.               
  37.         });  
  38.         //把自己放到Activity集合里面  
  39.         MainService.addActivity(this);  
  40.     }  
  41.   
  42.     public void init() {  
  43.           
  44.     }  
  45.   
  46.     public void refresh(Object... params) {  
  47.         TextView txtResult=(TextView) this.findViewById(R.id.txt_result);  
  48.         txtResult.setText(params[0].toString());  
  49.     }  
  50. }  

  此外还需更改布局文件main.xml

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.   <TextView android:id="@+id/txt_result"  
  8.             android:layout_width="fill_parent"   
  9.             android:layout_height="wrap_content"   
  10.             android:text="Test ADD Method" />  
  11.               
  12.   <Button android:id="@+id/btn_login"  
  13.             android:layout_width="fill_parent"   
  14.             android:layout_height="wrap_content"   
  15.             android:text="get"/>  
  16.   
  17. </LinearLayout>  

        对了,补充一个小问题,由于此视频讲解者是在用的SDK2.2,如果你的SDK版本高于2.2,且要运行视频中打包的代码时,即android api level由上向下兼容时,要修改一个参数,才能使在较低SDK版本下编写的代码在高版本上编译运行,具体做法:把project.properties最后一行target=android-i 中的i修改为你所用的版本平台。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值