【移动开发】Android应用程序中实用的代码框架(二)

简介:

在上次博客中,我总结了一套比较实用的代码框架,不知道有没有帮助到大家?j_0067.gif。。。(实用的代码框架http://smallwoniu.blog.51cto.com/blog/3911954/1307060)核心思想是:一个线程(在Activity中开启服务启动线程的方式)来监听处理任务队列中tasks,来对其依次处理。

细心地大家可能会发现要是任务在10个以下,框架还可以承担,要是任务过多时(主要是并发执行时),

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
      * 线程不断检测tasks中的任务
      */
     @Override
     public  void  run() {
         while (isRun) {
             Task task =  null ;
             if (!tasks.isEmpty()) {
                 task = tasks.poll();
                 if ( null  != task) {
                     doTask(task);  //处理任务
                 }
             }
             try  {
                 Thread.sleep( 1000 );
             catch  (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     }



鉴于实际开发中并发执行任务的情况较多!我整理了又一款非常实用的代码框架,也可以说是上次代码框架的加强版!

这次我采用了线程池的方式处理多任务,提高程序的运行效率。

111541752.jpg

首先是简单的一些类

IActivity类

1
2
3
4
5
6
7
8
9
10
11
12
package  com.zhf.android_frameworkdemo03.threadpool;
public  interface  IActivity {
     /**
      * 初始化操作
      */
     public  abstract  void  init();
     /**
      * 刷新操作
      * @param params 可变参数
      */
     public  abstract  void  refresh( Object ... params);
}

TaskID类:

1
2
3
4
5
6
7
package  com.zhf.android_frameworkdemo03.model;
public  class  TaskID {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
     public  static  final  int  MANAGER_LOGIN =  0 ; // 管理员登录
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
     //以此类推,根据自己项目的需求添加任务ID
}

TaskOperate类:

1
2
3
4
5
6
7
8
9
10
11
12
13
package  com.zhf.android_frameworkdemo03.threadpool;
/**
  * 任务操作接口
  * @author ZHF
  *
  */
public  interface  TaskOperate {
     /**
      * 操作Task
      * @param Task Task实体
      */
     public  abstract  void  operate(Task Task);
}


接下来是重要的类

ThreadPoolManager类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package  com.zhf.android_frameworkdemo03.threadpool;
import  java.util.Collections;
import  java.util.LinkedList;
import  java.util.List;
import  android.util.Log;
/**
  * 线程池管理器
  * @author ZHF
  *
  */
public  class  ThreadPoolManager {
     public  static  String TAG =  "ThreadPoolManager" ;
     public  static  ThreadPoolManager instance =  null ;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     //Returns a wrapper on the specified List which synchronizes all access to the List.
     public  static  List<Task> taskQueue = Collections.synchronizedList( new  LinkedList());  //任务队列(LinkedList:便于插入和删除)
     private  WorkThread[] workQueue;   //运行的线程数组
     private  static  int  threadNumber =  5 ;   //线程池数量5
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     /**构造方法(单例)**/
     private  ThreadPoolManager(TaskOperate taskOperate) {
         this (threadNumber, taskOperate);
     }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     /**构造方法(单例):实例化线程数组**/
     private  ThreadPoolManager( int  threadNumber, TaskOperate taskOperate) {
         this .threadNumber = threadNumber;
         this .workQueue =  new  WorkThread[threadNumber];   //装线程数组
         for  ( int  i =  0 ; i < threadNumber; i++) {
             this .workQueue[i] =  new  WorkThread(i, taskOperate);  //将线程对应装入数组
             System.out.println( "当前运行的是" + i + "个线程" );
         }
     }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     /**获取该类的实例对象(懒汉式)**/
     public  static  synchronized  ThreadPoolManager getInstance(TaskOperate taskOperate) {
         if (instance ==  null ) {
             instance =  new  ThreadPoolManager(taskOperate);
             return  instance;  //获取实例
         }
         return  null ;
     }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     /**添加单个任务**/
     public  void  addTask(Task task) {
         synchronized (taskQueue) {  //锁住线程队列对象
             if (task !=  null ) {
                 taskQueue.add(task);
                 taskQueue.notifyAll();
                 System.out.println( "任务: "  + task.getTaskInfo() +  "--添加成功--" );
             }
         }
     }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     /**添加多个任务**/
     public  void  addTasks(Task[] tasks) {
         synchronized  (taskQueue) {  //锁住线程队列对象
             for  (Task t : tasks) {  //遍历
                 if (tasks !=  null ) {
                     taskQueue.add(t);
                     taskQueue.notifyAll();
                     System.out.println( "任务: "  + t.getTaskInfo() +  "--添加成功--" );
                 }
             }
         }
     }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
     /**销毁线程**/
     public  void  destroy() {
         Log.i(TAG,  "线程池管理器destroy方法开始。。。" );
         for  ( int  i =  0 ; i < threadNumber; i++) {
             this .workQueue[i].stopThread();  //停止线程
             this .workQueue[i] =  null ;   //GC回收
         }
         synchronized (taskQueue) {  //锁住线程队列对象
             //清空队列集合
             taskQueue.clear();
         }
         Log.i(TAG,  "线程池管理器destroy方法结束。。。" );
         System.gc();  //内存回收
     }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
}

说明:

1.这里我并没有使用ThreadPoolExecutor来真正的实现线程池操作,而是用数组装载线程的方式模拟线程池操作,在实例化该类的时候(程序启动时)我们开启了5个WorkThread在后台等待执行任务。

2.该类还有两个重要的方法:

addTask()---->添加具体任务到任务队列

destroy() ---->销毁线程


WorkThread类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package  com.zhf.android_frameworkdemo03.threadpool;
import  android.util.Log;
/**
  * 工作线程
  * @author ZHF
  *
  */
public  class  WorkThread  extends  Thread {
     private  int  taskId;   //任务Id
     private  boolean  isRunning =  true ;   //线程启动标记
     private  TaskOperate taskOperate;   //任务操作接口
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
     /**构造方法:启动线程**/
     public  WorkThread( int  taskId, TaskOperate taskOperate) {
         this .taskId = taskId;
         this .taskOperate = taskOperate;
         //启动
         this .start();
     }
     @Override
     public  void  run() {
         while (isRunning) {
             Task task =  null ;
             synchronized  (ThreadPoolManager.taskQueue) {  //线程队列
                 //线程虽然开启,但是没有任务队列中没有添加具体任务进来
                 while (isRunning && ThreadPoolManager.taskQueue.isEmpty()) {
                     try  {
                         ThreadPoolManager.taskQueue.wait(20L);
                     catch  (InterruptedException e) {
                         System.out.println( "线程"  this .taskId +  "在运行时,报InterruptedException" );
                         Log.e(ThreadPoolManager.TAG,  "线程"  this .taskId +  "在运行时,报InterruptedException" );
                         e.printStackTrace();
                     }
                 }
                 if ( this .isRunning) {
                     //移除任务
                     task = ThreadPoolManager.taskQueue.remove( 0 );
                 }
             }
             //有任务进来
             if (task !=  null ) {
                 System.out.println(task.getTaskInfo() +  "任务在线程" this .taskId +  "中开始。。。" );
                  //处理任务(调用接口中方法处理,具体实现在子类当中。多态)
                 this .taskOperate.operate(task);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
                 System.out.println(task.getTaskInfo() +  "任务在线程"  this .taskId +  "结束中。。。" );
             }
         }
     }
     /**停止线程**/
     public  void  stopThread() {
         this .isRunning =  false ;
     }
}

说明:

该类是一个线程类,主要用于处理任务队列中任务事件,5个线程共同处理任务集合中的task,避免了先前一个线程处理task时,后一个task等待的情况,提高了系统的执行效率!


ClientTask类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package  com.zhf.android_frameworkdemo03.services;
import  android.os.Handler;
import  android.os.Message;
import  com.zhf.android_frameworkdemo03.MyApplication;
import  com.zhf.android_frameworkdemo03.handle.LoginHandler;
import  com.zhf.android_frameworkdemo03.model.TaskID;
import  com.zhf.android_frameworkdemo03.threadpool.IActivity;
import  com.zhf.android_frameworkdemo03.threadpool.Task;
import  com.zhf.android_frameworkdemo03.threadpool.TaskOperate;
/**
  * 统一处理任务类
  * @author ZHF
  *
  */
public  class  ClientTask  implements  TaskOperate{
     /**统一任务处理**/
     @Override
     public  void  operate(Task task) {
         Message message = mHandler.obtainMessage();
         message.what = task.getId();
                                                                                                                                                                                                                                                                                                                                                                                                          
         //1.根据TaskID来判断,调用对应的XXhandler来处理任务
         //2.处理完成得到返回的message.obj数据,将其统一sendMessage(message)出去
         //3.在消息处理机制mHandler中对应接收数据,刷新对应的UI界面
                                                                                                                                                                                                                                                                                                                                                                                                          
         switch  (task.getId()) {
         case  TaskID.MANAGER_LOGIN:  //管理员登陆
             //处理登录事件,获取message.obj数据
             LoginHandler.getLogin(task, message);
             break ;
                                                                                                                                                                                                                                                                                                                                                                                                              
             //此处添加后续任务
         }
         mHandler.sendMessage(message); //发送消息
     }
     /**消息处理**/
     public  Handler mHandler =  new  Handler() {
         @Override
         public  void  handleMessage(Message msg) {
             super .handleMessage(msg);
             IActivity ia =  null ;
             //根据传来的任务消息ID,来对应的传递参数刷新界面
             switch  (msg.what) {
             case  TaskID.MANAGER_LOGIN:   //管理员登陆
                 ia = MyApplication.getActivityByName( "MainActivity" );
                 ia.refresh(msg.obj);
                 break ;
                                                                                                                                                                                                                                                                                                                                                                                                                  
             //此处添加后续任务
             }
         }
     };
}

说明:

1.该类实现了先前定义的TaskOperate接口,重写了operate()处理任务,对应TaskID我们新建了一个类LoginHandler来处理,最后接收处理结果message.obj,并统一发送到mHandler接收,刷新对应的UI界面。

2.注意:该类我们实现的是客户端的一系列请求任务,当然我们还可以再定义一个类,实现TaskOperate接口,用于统一操作服务器端Task,也是可以的,扩展么!)


LoginHandler类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package  com.zhf.android_frameworkdemo03.handle;
import  com.zhf.android_frameworkdemo03.threadpool.Task;
import  android.os.Message;
/**
  * 登录事件处理
  * @author ZHF
  *
  */
public  class  LoginHandler {
                                                                                                                                                                                                     
     /**处理登录事物,将结果用消息发送出去**/
     public  static  void  getLogin(Task task, Message message) {
         //处理完成。。。。
         message.obj =  "登陆成功!" ;
     }
}


程序入口

MainActivity类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package  com.zhf.android_frameworkdemo03;
import  com.zhf.android_frameworkdemo03.model.TaskID;
import  com.zhf.android_frameworkdemo03.threadpool.IActivity;
import  com.zhf.android_frameworkdemo03.threadpool.Task;
import  android.os.Bundle;
import  android.view.View;
import  android.view.View.OnClickListener;
import  android.widget.Button;
import  android.widget.TextView;
import  android.app.Activity;
public  class  MainActivity  extends  Activity  implements  IActivity{
                                                                                                                                                              
     public  Button mBtnLogin;  //登陆按钮:测试代码框架是否运行正常
     public  TextView mTvLogin;
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
                                                                                                                                                                  
         //1.将要执行任务的Activity,加入到集合中
         MyApplication.allActivity.add( this );
                                                                                                                                                                  
         this .mBtnLogin = (Button) findViewById(R.id.button1);
         this .mTvLogin = (TextView) findViewById(R.id.textView1);
         mBtnLogin.setOnClickListener( new  OnClickListener() {
             @Override
             public  void  onClick(View v) {
                 //2.产生任务:对应填入参数
                 Task task =  new  Task(TaskID.MANAGER_LOGIN,  "框架测试成功!!" "---登陆任务----" );
                 //3.将当前任务加入到写好的线程池中()
                 MyApplication.poolManager.addTask(task);
             }
         });
     }
     @Override
     public  void  init() {
         // TODO Auto-generated method stub
                                                                                                                                                                  
     }
     @Override
     public  void  refresh(Object... params) {
         //接收线程处理过后返回的数据
         mTvLogin.setText(params[ 0 ].toString());
     }
}


MyApplication类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package  com.zhf.android_frameworkdemo03;
import  java.util.ArrayList;
import  com.zhf.android_frameworkdemo03.services.ClientTask;
import  com.zhf.android_frameworkdemo03.threadpool.IActivity;
import  com.zhf.android_frameworkdemo03.threadpool.ThreadPoolManager;
import  android.app.Application;
/**
  *加载配置文件,监测网络情况,初始化任务线程池
  * @author ZHF
  *
  */
public  class  MyApplication  extends  Application{
                                                                                                                                                                        
     // 所有实现接口IActivity的Activity,即放置所有要执行任务的Activity
     public  static  ArrayList<IActivity> allActivity =  new  ArrayList<IActivity>();
     public  static  ThreadPoolManager poolManager;
                                                                                                                                                                        
     /**程序启动**/
     @Override
     public  void  onCreate() {
         super .onCreate();
         //程序启动时,开启线程池(5个线程,等待task)
         poolManager = ThreadPoolManager.getInstance( new  ClientTask());
                                                                                                                                                                            
     }
                                                                                                                                                                        
     /**根据名字获取Activity**/
     public  static  IActivity getActivityByName( String  name) {
         IActivity ia =  null ;
         for  (IActivity ac : allActivity) {
             if  (ac.getClass().getName().endsWith(name)) {
                 ia = ac;
             }
         }
         return  ia;
     }
}



到此,强大的代码框架已搭建起来,我们点击一下按钮,测试一下代码吧!

151936977.png ---------》151938141.png


为了让大家看的更清楚,我打印出了后台数据!

152200402.jpg

为了显示出框架的威力!我们可以试试狂点按钮,通过后台数据,我们知道了每次处理该任务是不同的线程!

152339329.jpg


框架代码源码下载地址:http://down.51cto.com/data/1011299





     本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1324842,如需转载请自行联系原作者



相关文章
|
10天前
|
开发框架 前端开发 Android开发
移动应用开发的未来:跨平台框架与原生系统的融合
【4月更文挑战第9天】随着移动设备成为日常生活的核心,移动应用的重要性日益凸显。本文探讨了移动应用开发的新趋势,特别是跨平台开发框架的兴起以及它们与传统移动操作系统之间的融合。分析了Flutter、React Native等流行的跨平台工具,并考察了它们如何优化性能、提高开发效率及对市场的影响。同时,文章也着眼于移动操作系统的最新进展,包括Android和iOS在兼容性、安全性和用户体验方面的创新。最后,展望了未来移动应用开发可能的方向,包括人工智能的集成、物联网的交互性以及5G网络带来的变革。
28 0
|
16天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
17天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
1天前
|
缓存 移动开发 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【4月更文挑战第18天】 在移动开发的世界中,打造一个既快速又流畅的Android应用并非易事。本文深入探讨了如何通过一系列创新的技术策略来提升应用性能和用户体验。我们将从用户界面(UI)设计的简约性原则出发,探索响应式布局和Material Design的实践,再深入剖析后台任务处理、内存管理和电池寿命优化的技巧。此外,文中还将讨论最新的Android Jetpack组件如何帮助开发者更高效地构建高质量的应用。此内容不仅适合经验丰富的开发者深化理解,也适合初学者构建起对Android高效开发的基础认识。
2 0
|
1天前
|
移动开发 Android开发 开发者
构建高效Android应用:采用Kotlin进行内存优化的策略
【4月更文挑战第18天】 在移动开发领域,性能优化一直是开发者关注的焦点。特别是对于Android应用而言,由于设备和版本的多样性,确保应用流畅运行且占用资源少是一大挑战。本文将探讨使用Kotlin语言开发Android应用时,如何通过内存优化来提升应用性能。我们将从减少不必要的对象创建、合理使用数据结构、避免内存泄漏等方面入手,提供实用的代码示例和最佳实践,帮助开发者构建更加高效的Android应用。
4 0
|
3天前
|
缓存 移动开发 Java
构建高效的Android应用:内存优化策略
【4月更文挑战第16天】 在移动开发领域,尤其是针对资源有限的Android设备,内存优化是提升应用性能和用户体验的关键因素。本文将深入探讨Android应用的内存管理机制,分析常见的内存泄漏问题,并提出一系列实用的内存优化技巧。通过这些策略的实施,开发者可以显著减少应用的内存占用,避免不必要的后台服务,以及提高垃圾回收效率,从而延长设备的电池寿命并确保应用的流畅运行。
|
5天前
|
搜索推荐 开发工具 Android开发
安卓即时应用(Instant Apps)开发指南
【4月更文挑战第14天】Android Instant Apps让用户体验部分应用功能而无需完整下载。开发者需将应用拆分成模块,基于已上线的基础应用构建。使用Android Studio的Instant Apps Feature Library定义模块特性,优化代码与资源以减小模块大小,同步管理即时应用和基础应用的版本。经过测试,可发布至Google Play Console,提升用户便利性,创造新获客机会。
|
6天前
|
Java API 调度
安卓多线程和并发处理:提高应用效率
【4月更文挑战第13天】本文探讨了安卓应用中多线程和并发处理的优化方法,包括使用Thread、AsyncTask、Loader、IntentService、JobScheduler、WorkManager以及线程池。此外,还介绍了RxJava和Kotlin协程作为异步编程工具。理解并恰当运用这些技术能提升应用效率,避免UI卡顿,确保良好用户体验。随着安卓技术发展,更高级的异步处理工具将助力开发者构建高性能应用。
|
6天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
8天前
|
机器学习/深度学习 人工智能 前端开发
移动应用开发的未来:跨平台框架与原生系统之争
【4月更文挑战第11天】 随着移动互联网的飞速发展,移动应用已成为日常生活和商业活动不可或缺的组成部分。本文探讨了移动应用开发的两大趋势——跨平台移动应用框架与原生操作系统应用——之间的竞争与协作关系。文章分析了两者在性能、用户体验、开发效率及未来技术发展上的优劣,旨在为开发者和企业提供深入见解,帮助他们在选择合适的开发策略时做出更明智的决策。

热门文章

最新文章