Android新浪微博客户端(一)——主框架搭建

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

          Eclipse中代码结构如下图:

      

      Logic层的Mainservice

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

  

 MainService代码如下


提前声明的是,我是按照Ivan的这套教程学下来的。

首先,对于任何应用我们都需要建立一套消息处理机制,就是当用户在UI界面上点击了什么,你应该做出什么样的处理,处理完成之后又要将结果 反馈给用户,显示在UI界面上。简而言之:主框架在这里主要是搭建起一个异步消息处理机制,UI线程中发送消息,service处理消息,处理完了调用UI线程实例更新UI界面。先看看这里是怎么处理的,如下图:

解析:在程序启动时开启MainServiceMainService中新开个线程来不断循环的监听Tasks中是否有任务。当UI界面的主线程接收到用户的某个操作时,就会调用MainService.newTask()将这个任务放进Tasks中,并且把Activity放进Activities。这样在MainService中的第二线程就会监听到这个任务,就会调用MainService.doTask(),当做完处理后MainService第二线程就会向MainService主线程发送Handler消息,将处理得一些数据发送到Acitivity中,然后调用的Activity.refresh()就能刷新页面了。这里要强调的是UI层的Activity都要实现IWeiboActivity这样一个接口,实现他的refresh(),init()两个抽象方法。

MainService.java

复制代码
  1 package com.fangjie.weibo.logic;
  2  
  3 import java.util.ArrayList;
  4 import java.util.LinkedList;
  5 import java.util.List;
  6 import java.util.Queue;
  7  
  8 import android.app.Activity;
  9 import android.app.Service;
 10 import android.content.Intent;
 11 import android.os.Handler;
 12 import android.os.IBinder;
 13 import android.os.Message;
 14 import android.util.Log;
 15  
 16 import com.fangjie.weibo.bean.*;
 17 import com.fangjie.weibo.db.DBUserInfo;
 18 import com.fangjie.weibo.ui.IWeiboAcitivity;
 19 import com.fangjie.weibo.util.GetUserInfo;
 20 import com.weibo.sdk.android.Oauth2AccessToken;
 21  
 22 public class MainService extends Service implements Runnable{
 23  
 24     private static Queue<Task> tasks=new LinkedList<Task>();
 25     private static ArrayList<Activity> appActivities=new ArrayList<Activity>();
 26      
 27     private boolean isRun;
 28     private Handler handler;
 29      
 30     @Override
 31     public void onCreate() {
 32         // TODO Auto-generated method stub  
 33         /**
 34          * 在MainService中开启第二线程来处理任务
 35          * 主要是不断监听Tasks堆栈,从Tasks中处理task
 36          */
 37         isRun=true;     
 38         Thread thread =new Thread(this);
 39         thread.start();
 40         super.onCreate();
 41          
 42         /**
 43          * 主要是获取从MainService第二线程(doTask)中获取处理完任务的数据
 44          * 并通知更新UI界面
 45          */
 46         handler =new  Handler(){
 47             public void handleMessage(Message msg)
 48             {
 49                 IWeiboAcitivity activity=null;
 50                 switch(msg.what)
 51                 {
 52                     case Task.WEIBO_LOGIN:
 53                         activity=(IWeiboAcitivity)getActivityByName("LoginActivity");
 54                         activity.refresh(Task.WEIBO_LOGIN,msg.obj);
 55                         break;
 56                     case Task.GET_USERINFO_BY_TOKEN:
 57  
 58                         break;      
 59                     case Task.GET_USERINFO_IN_LOGIN:
 60  
 61                         break;              
 62                     default:
 63                         break;
 64                 }
 65             }
 66         };
 67  
 68     }
 69  
 70     @Override
 71     public void run() {
 72         // TODO Auto-generated method stub
 73         while(isRun)
 74         {
 75             if(!tasks.isEmpty())
 76             {
 77                 doTask(tasks.poll());
 78             }
 79         }
 80     }
 81      
 82     /**
 83      * UI层向MainService中发送任务task
 84      * UI层调用,所以static
 85      * @param task
 86      */
 87     public static void newTask(Task task)
 88     {
 89         tasks.add(task);
 90     }
 91      
 92     /**
 93      * UI层向MainService中发送任务的同时,同样要发送自己Activity,
 94      * 以便在MainService中调用refresh();
 95      * @param task
 96      */
 97     public static void addActivty(Activity activity)
 98     {
 99         appActivities.add(activity);
100     }
101     /**
102      * UI层中有向MainService中传递Activity,在任务结束后(refresh),应去除该Activity,防止混淆!
103      * @param activity
104      */
105     public static void reMoveActivty(Activity activity)
106     {
107         appActivities.remove(activity);
108     }
109      
110     /**
111      * 通过name获取新开任务时传递过来的Activity实例
112      * @param name
113      * @return
114      */
115     public Activity getActivityByName(String name)
116     {
117         if(!appActivities.isEmpty())
118         {
119             for(Activity activity:appActivities)
120             {
121                 if(activity.getClass().getName().indexOf(name)>0)
122                 {
123                     return activity;
124                 }
125             }
126         }
127         return null;
128     }
129  
130     /**
131      * 处理Tasks堆栈中的task
132      * @param task
133      */
134     public void doTask(Task task)
135     {
136         Message msg=handler.obtainMessage();
137         msg.what=task.getTaskID();
138          
139         switch(task.getTaskID())
140         {
141             //登录操作
142             case Task.WEIBO_LOGIN:
143                 System.out.println("login successful");
144                 msg.obj="登录成功";
145                 break;
146                  
147             //通过access_token获取用户信息,并保存到数据库操作    
148             case Task.GET_USERINFO_BY_TOKEN:
149                         msg.obj="成功";
150                 break;
151                  
152             //登录界面获取用户信息显示操作
153             case Task.GET_USERINFO_IN_LOGIN:            
154                         msg.obj="成功";
155                 break;
156             default :
157                 break;
158         }
159         handler.sendMessage(msg);
160     }
161  
162      
163     @Override
164     public IBinder onBind(Intent intent) {
165         // TODO Auto-generated method stub
166         return null;
167     }
168 }
复制代码

再看看我的工程文件架构,如下图:

Task.java是任务的实体类,包含任务的ID,任务的参数成员变量,IWeiboActivity就是所有Activity要实现的接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值