android 网络应用轻量框架

框架代码下载地址:Demo代码下载





关于框架有意见 欢迎联系我一起探讨。

联系方式 我的QQ是275518834 问答是happy

操作方式:输入文本框设置线程数
点击第一个按钮请求10个地址信息
点击第二个按钮中断10个地址信息

1:判断当前网络环境

2:编写了3套方案
Old_GridViewActivity  简单线程回调  
AsyncTask_GridViewActivity  使用android自带的AsyncTask类实现
Demo_GridViewActivity   队列任务管理  线程控制

1:队列优先级  (如果想要listview中移动的区域优先被显示,而不是从上到下显示图片,可以把新建的任务提到任务队列前端)

2:实现了:中断任务的功能(比如进入一个Activity会开启大量任务,如果退出这个Activity 则应该停止此Activity中驻留的任务)

3:为何采用drawable不用bitmap
bitmap优点是位图运算效率优秀
但drawable的存储体积比bitmap小

4:如果任务被起名字则禁止重复提交任务  (避免某些请求未处理完又被创建)

5:先执行缓存数据后执行请求数据      (缓存性能)

6:使用状态模式 观察者模式更好的处理多线程 


最初的想法:网络优化开发框架  (移除任务未完成)
网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性

(旧的系统症结所在)
开启过多线程,导致系统频繁切换多个线程,导致处理速度过慢,经常出现未响应。
代码经常写的换繁多无序,维护困难。


使用类似银行叫号系统
线程池内等待网络请求的任务=(排队的人)
最大三个线程=(银行柜台处理业务的窗口)
依次处理任务=(将排队的人依次被叫到处理的号,完成业务的窗口叫号后面排队的人)
如果抛出异常则通知相关单位=(如果银行柜台处理不了一个人的业务就打电话给大堂经理)
设置柜台的监听回调=(A委托B去银行请求数据,当B去银行处理业务失败了,通知A。)
设置撤销机制和线程安全=
    某机关让A和B去银行申请业务,A在排队,B正在柜台处理业务,此时机关打来电话说,
    这申请业务的需求现在不做,A取消排队,B也‘礼貌的退出’
    《例如退出A页面时,终止A页面所有的请求》


任务状态标示-还没处理 处理中 处理结束 处理异常 (有结果但不通知)=(排队人的状态)
任务名          排队人的名字
强制退出

   强制退出 抛出强制退出的异常



package lxz.utils.android.network;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Observable;
import java.util.Observer;

import android.content.Context;
import android.os.Handler;

public abstract class Task implements Runnable, Observer {
	String debug = getClass().getSimpleName();

	// 名字映射
	private static HashMap<String, Task> nameTasks = new HashMap<String, Task>();

	public static HashMap<String, Task> getNameTask() {
		return nameTasks;

	}

	public void setSingletonName(String singletonName) {
		this.singletonName = singletonName;
	}

	public String getSingletonName() {
		return singletonName;
	}

	public interface OnStartListen {
		void onStart(int taskID);
	}

	public interface OnProgressListen {
		void onProgress(int taskID, int progress);
	}

	public interface OnFinishListen {
		Boolean OnFinish(int taskID, Object data);
	}

	public interface OnSystemStartListen {
		void onSystemStart(int taskID);
	}

	public interface OnSystemFinishListen {
		Boolean OnSystemFinish(int taskID, Object data, Task t);
	}

	/** 请求参数 */
	protected Object parameter;
	/** 任务开始监听 */
	protected OnStartListen onStartListen;
	/** 任务进度监听 */
	protected OnProgressListen onProgressListen;
	/** 任务完成监听 */
	protected OnFinishListen onFinishListen;
	/** 任务在队列中完成 监听 */
	protected OnSystemStartListen onSystemStartListen;
	/** 任务在队列中开始 监听 */
	protected OnSystemFinishListen onSystemFinishListen;
	/** 用于任务完成后发送消息 */
	protected Handler handler;
	/** 结果 */
	protected Object result;
	/** 任务编号标示 */
	protected int taskID;
	/** 任务名字标示 */
	/** 设置此任务名是否为单例,单例模式下,如果相同名字的任务未执行完,则无法添加新任务 */
	protected String singletonName;

	/** 保存一个对象 */
	protected Object tag;
	/** 获得当前自身线程的引用 在threadRun方法 */
	protected Thread thread;
	/** 重连次数 */
	protected int tryAgainCount = 1;
	/** 重连间隔 */
	protected int tryAgainTime = 1000;
	/** 视图绑定 */
	protected TaskViewHolder taskViewHolder;

	/** 任务观察者 */
	protected TaskObservable taskObservable;

	protected Context context;

	protected Task() {
	}

	protected Task(TaskViewHolder taskViewHolder) {
		super();
		this.taskViewHolder = taskViewHolder;
		this.handler = taskViewHolder.getActivityHandler();
		this.taskViewHolder.getTaskObservable().addObserver(this);
		this.context = taskViewHolder.getContext();
		this.taskObservable = this.taskViewHolder.getTaskObservable();
	}

	protected Task(TaskObservable taskObservable) {
		super();
		taskObservable.addObserver(this);
	}

	public TaskViewHolder getTaskViewHolder() {
		return taskViewHolder;
	}

	public void setTaskViewHolder(TaskViewHolder taskViewHolder) {
		this.taskViewHolder = taskViewHolder;
	}

	/** 状态 */
	int status = UNTREATED;

	final static int ERROR = -1;
	final static int UNTREATED = 0;
	final static int FINSH = 1;
	final static int TREATEDING = 2;

	// 不处理
	final static int WITHOUT = 3;

	/** 启动线程 */
	public void threadRun() {
		thread = new Thread(this);
		thread.start();
	}

	// 中断Execute方法
	public abstract void shutDownExecute();

	public abstract Object cacheData(Object parameter);

	// 禁止被重写
	public final Object Execute() throws Exception {
		// TODO Auto-generated method stub
		if (onStartListen != null)
			onStartListen.onStart(taskID);

		// 队列中回调
		if (onSystemStartListen != null)
			onSystemStartListen.onSystemStart(taskID);
		// 状态从未处理改变为处理中
		status = TREATEDING;

		// 是否有缓存数据如果没有
		if ((result = cacheData(parameter)) == null) {

			// 失败重联次数
			for (int i = 0; i < tryAgainCount; i++) {
				try {
					result = obtainData(result, parameter);
					break;
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					try {
						Thread.sleep(tryAgainTime);
					} catch (Exception e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
		}
      
		// 如果状态改变为处理完但不通知
		if (status != WITHOUT) {

			if (handler != null) {
				handler.obtainMessage(taskID, result).sendToTarget();
			}
			if (onFinishListen != null) {
				onFinishListen.OnFinish(taskID, result);
			}
		}
		  if (onSystemFinishListen != null) {
				onSystemFinishListen.OnSystemFinish(taskID, result, this);
			}

		status = FINSH;
		return result;
	}

	public int getTryAgainCount() {
		return tryAgainCount;
	}

	public void setTryAgainCount(int tryAgainCount) {
		this.tryAgainCount = tryAgainCount;
	}

	public int getTryAgainTime() {
		return tryAgainTime;
	}

	public void setTryAgainTime(int tryAgainTime) {
		this.tryAgainTime = tryAgainTime;
	}

	public abstract Object obtainData(Object result, Object parameter)
			throws Exception;

	@Override
	public void update(Observable observable, Object data) {
		// 移除观察
		observable.deleteObserver(this);
		// 中断 停止关闭连接
		this.shutDownExecute();
		this.setWithout();
		if (this.thread != null) {
			this.thread.interrupt();
		}
		// 错误尝试次数为0
		this.tryAgainCount = 0;
	};

	@Override
	public void run() {

		try {
			Execute();
		} catch (Exception e) {
			taskID = ERROR;

			// 如果状态改变为处理完但不通知
			if (status != WITHOUT) {
				if (handler != null) {
					handler.obtainMessage(taskID, e).sendToTarget();
				}
				if (onFinishListen != null) {
					onFinishListen.OnFinish(taskID, e);
				}
			}
			if (onSystemFinishListen != null) {
				onSystemFinishListen.OnSystemFinish(taskID, e, this);
			}
		}

	}

	public void setWithout() {
		this.status = WITHOUT;
	}

	public Object getTag() {
		return tag;
	}

	public void setTag(Object tag) {
		this.tag = tag;
	}

	public Thread getThread() {
		return thread;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public Object getParameter() {
		return parameter;
	}

	public void setParameter(Object parameter) {
		this.parameter = parameter;
	}

	public OnStartListen getOnStartListen() {
		return onStartListen;
	}

	public void setOnStartListen(OnStartListen onStartListen) {
		this.onStartListen = onStartListen;
	}

	public OnProgressListen getOnProgressListen() {
		return onProgressListen;
	}

	public void setOnProgressListen(OnProgressListen onProgressListen) {
		this.onProgressListen = onProgressListen;
	}

	public OnFinishListen getOnFinishListen() {
		return onFinishListen;
	}

	public void setOnFinishListen(OnFinishListen onFinishListen) {
		this.onFinishListen = onFinishListen;
	}

	public OnSystemStartListen getOnSystemStartListen() {
		return onSystemStartListen;
	}

	public OnSystemFinishListen getOnSystemFinishListen() {
		return onSystemFinishListen;
	}

	public void setOnSystemFinishListen(
			OnSystemFinishListen onSystemFinishListen) {
		this.onSystemFinishListen = onSystemFinishListen;
	}

	public Handler getHandler() {
		return handler;
	}

	public void setHandler(Handler handler) {
		this.handler = handler;
	}

	public int getTaskID() {
		return taskID;
	}

	public void setTaskID(int taskID) {
		this.taskID = taskID;
	}

	public Object getResult() {
		return result;
	}

	public void setResult(Object result) {
		this.result = result;
	}

	public void cacheClear() {
		if(parameter!=null)parameter=null;
		if(onStartListen!=null)onStartListen=null;
		if(onProgressListen!=null)onProgressListen=null;
		if(onFinishListen!=null)onFinishListen=null;
		if(onSystemStartListen!=null)onSystemStartListen=null;
		if(onSystemFinishListen!=null)onSystemFinishListen=null;
		if(handler!=null)handler=null;
		if(result!=null)result=null;
		if(singletonName!=null)singletonName=null;
		if(tag!=null)tag=null;
		if(thread!=null)thread=null;
		if(taskViewHolder!=null)taskViewHolder=null;
		if(taskObservable!=null)taskObservable=null;
		if(context!=null)context=null;
	}

}
package lxz.utils.android.network;

import java.util.ArrayList;
import java.util.LinkedList;

import android.util.Log;

import lxz.utils.android.network.Task.OnSystemFinishListen;



public class TaskQueue implements Runnable, OnSystemFinishListen {
	static String debug = "TaskQueue";
	@SuppressWarnings("unchecked")
	// 在等待的任务队列
	static LinkedList<Task> tasks_wait = new LinkedList<Task>();
	// 正在执行的任务
	static ArrayList<Task> tasks_running = new ArrayList<Task>();
	// 是否持续运行
	public static boolean isRun;
	// 队列线程
	private static Thread taskQueueThread;
	// runnable保证线程安全
	private static TaskQueue runnable = new TaskQueue();;
	// 最大线程数
	static int ThreadMaxNum = 1;

	// 如果队列线程为空或者停止则重新开启
	public static void serivesRun() {
		// TODO Auto-generated method stub

		if (taskQueueThread == null
				|| (taskQueueThread != null && taskQueueThread.getState() == Thread.State.TERMINATED)) {
			taskQueueThread = new Thread(runnable);
			// taskQueueThread.setPriority(Thread.MAX_PRIORITY);
			taskQueueThread.start();

		}
	}

	// 线程锁 如果等待队列的任务数不为空,并且当前线程数字少于最大线程数
	public static boolean taskRun() {
		synchronized (tasks_wait) {
			synchronized (tasks_running) {
				return !tasks_wait.isEmpty()
						&& tasks_running.size() < ThreadMaxNum;
			}
		}
	}

	public void run() {
		// 线程锁 如果等待队列的任务数不为空,并且当前线程数字少于最大线程数
	
		while (taskRun()) {
			// 添加带执行中动态数组中
			Task h;
			synchronized (tasks_wait) {
				// 从等待任务的队列中获取并移除此列表的头(第一个元素)
				h = tasks_wait.poll();

				// 如果h为空则从队列重新取对象或者任务绑定的状态变化了
				if (h == null || h.status == Task.WITHOUT) {
					Log.i(debug , "任务取消 编号" + h.getTaskID());
      		        //移除此名字映射
		             if(h.getSingletonName()!=null)
		             {
		            	 Task.getNameTask().remove(h.getSingletonName());
		             }
					
					continue;
				}
				synchronized (tasks_running) {
					tasks_running.add(h);
				}
					 Log.i(debug , "正在执行任务数"
				 + tasks_running.size()+ "/上限" + ThreadMaxNum);


				// 为h设置完成或者报错进行监听
				h.setOnSystemFinishListen(runnable);
				// 启动此线程
				
			}
                h.threadRun();
		}

	}

	@Override
	public Boolean OnSystemFinish(int taskID, Object data, Task t) {
		// TODO Auto-generated method stub
		synchronized (tasks_running) {
			// 从处理中的动态数组中移除此任务
			tasks_running.remove(t);
			Log.i(debug,"执行队列中移除任务taskid=" + t.taskID);
			// 通知执行后续未处理的任务
			 Log.i(debug , "正在执行任务数"
					 + tasks_running.size()+ "/上限" + ThreadMaxNum);
			 
			 //移除此名字映射
             if(t.getSingletonName()!=null)
             {
            	 Task.getNameTask().remove(t.getSingletonName());
             }
		}
		runnable.run();
		synchronized (tasks_wait) {

			// 如果等待队列中的任务
			if (tasks_wait.isEmpty())
				taskQueueThread = null;
		}
		t.cacheClear();
		return true;
	}	
}
框架代码下载地址:Demo代码下载



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值