文档章节

android封装工作线程跟Handler工具类

moz1q1
 moz1q1
发布于 2017/05/05 11:00
字数 433
阅读 157
收藏 0

直接上代码,不解说 - -

基于MVP封装P的基类

AbsHandlerThreadHelper.java

import java.lang.ref.WeakReference;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

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

public abstract class AbsHandlerThreadHelper<T extends Context> {

	protected ExecutorService mExecutorService;

	private WeakReference<T> mContextWeakReference;

	protected HandlerInner<T> mHandler;

	protected static class HandlerInner<T  extends Context> extends Handler {

		private WeakReference<AbsHandlerThreadHelper<T>> mWeakReference;

		public HandlerInner(AbsHandlerThreadHelper<T> handlerThreadHelper) {
			super();
			this.mWeakReference = new WeakReference<AbsHandlerThreadHelper<T>>(handlerThreadHelper);
		}

		@Override
		public void dispatchMessage(Message msg) {
			super.dispatchMessage(msg);
			AbsHandlerThreadHelper<T> handlerThreadHelper = mWeakReference.get();
			if (handlerThreadHelper != null) {
				handlerThreadHelper.dispatchMessage(msg);
			}
		}
	}

	public AbsHandlerThreadHelper(T t) {
		super();
		this.mContextWeakReference = new WeakReference<T>(t);
		init();
	}

	private void init() {
		mExecutorService = Executors.newCachedThreadPool();
		mHandler = new HandlerInner<T>(this);
	}

	public T getContext() {
		return mContextWeakReference.get();
	}

	public abstract void dispatchMessage(Message msg);

	public void onPreDestroy() {
		onDestroy();
		if (mExecutorService != null) {
			mExecutorService.shutdown();
		}
		mExecutorService = null;
		if (mHandler != null) {
			mHandler.removeCallbacksAndMessages(null);
		}
		mHandler = null;
		if (mContextWeakReference != null) {
			mContextWeakReference.clear();
		}
		mContextWeakReference = null;
	}

	public abstract void onDestroy();
}

线程的基类

AbsThread.java

import java.lang.ref.WeakReference;

import android.content.Context;

public abstract class AbsThread<T extends Context> implements Runnable {

	protected WeakReference<AbsHandlerThreadHelper<T>> mReference;

	public AbsThread(AbsHandlerThreadHelper<T> handlerThreadHelper) {
		super();
		this.mReference = new WeakReference<AbsHandlerThreadHelper<T>>(handlerThreadHelper);
	}

	@Override
	public void run() {
		synchronized (this) {
			AbsHandlerThreadHelper<T> handlerThreadHelper = mReference.get();
			if (handlerThreadHelper != null) {
				runPro();
			}
		}
	}

	public  abstract  void runPro();
}

我用的是okhttp3的,所以封装多一个AbsOkHttpThread.java

import java.io.IOException;

import android.content.Context;
import android.os.Message;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public abstract class AbsOkHttpThread<T extends Context> extends AbsThread<T> implements Callback {

	private int success = 0;

	private int fail = -1;

	public AbsOkHttpThread(AbsHandlerThreadHelper<T> handlerThreadHelper) {
		super(handlerThreadHelper);
	}

	public AbsOkHttpThread(AbsHandlerThreadHelper<T> handlerThreadHelper, int success, int fail) {
		super(handlerThreadHelper);
		this.success = success;
		this.fail = fail;
	}

	@Override
	public void onFailure(Call call, IOException exception) {
		AbsHandlerThreadHelper<T> handlerThreadHelper = mReference.get();
		if (handlerThreadHelper != null) {
			handlerThreadHelper.mHandler.sendEmptyMessage(fail);
		}
	}

	@Override
	public void onResponse(Call call, Response response) throws IOException {
		try {
			AbsHandlerThreadHelper<T> handlerThreadHelper = mReference.get();
			if (handlerThreadHelper != null) {
				Message msg  = new Message();
				//TODO call
				final String result = response.body().string();
				msg.obj = result;
				msg.what = success;
				handlerThreadHelper.mHandler.sendMessage(msg);
			}
		} catch (Exception e) {
			onFailure(call, null);
		}
	}
}

例子DemoPresenter.java

import android.app.Service;
import android.os.Message;

public class DemoPresenter extends AbsHandlerThreadHelper<Service> {

	private TestRun testRun;

	public DemoPresenter(Service t) {
		super(t);
		testRun = new TestRun(this, 3, 2);
	}

	@Override
	public void dispatchMessage(Message msg) {
		LogDebug.e(getContext(), "DemoPresenter.dispatchMessage:" + msg.what);
	}

	@Override
	public void onDestroy() {

	}

	public void register() {
		mExecutorService.execute(testRun);
	}

	private static class TestRun extends AbsOkHttpThread<Service> {

		public TestRun(AbsHandlerThreadHelper<Service> handlerThreadHelper, int success, int fail) {
			super(handlerThreadHelper, success, fail);
		}

		@Override
		public void runPro() {
			AbsHandlerThreadHelper<Service> absHandlerThreadHelper = mReference.get();
			Service context = absHandlerThreadHelper.getContext();
			if (context != null) {
				OkHttp3Utils.getInstance(context).doPostPro("http://www.google.com", null, "{}", this);
			}
		}
	}
}

 

© 著作权归作者所有

共有 人打赏支持
moz1q1
粉丝 52
博文 349
码字总数 117339
作品 0
东莞
程序员
android消息机制,异步和多线程

android消息机制,异步和多线程 前言 在xxxx1.92正式版的时候付费购买曾单独封装了一个流程PaymentFlow并继承于Handler,调用方只要依据这个流程创建流程实例并触发开始,实例即可依据设定的支付...

ZHL
2012/09/03
0
0
android的消息处理机制(图+源码分析)——Looper,Handler,Message

作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想。android源码中包含了大量的设计模式,除此以外,android sdk还精心为我们设计了各种helper类...

火蚁
2014/05/14
0
0
Android的消息处理机制(图+源码分析)——Looper,Handler,Message

作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设计思想。android源码中包含了大量的设 计模式,除此以外,android sdk还精心为我们设计了各种helper类...

Jerikc
2013/12/28
0
0
android的消息处理机制——Looper,Handler,Message

这篇文章有一半是copy别人的,站在巨人的肩膀上,我们才能看得更高更远...... 在开始讨论android的消息处理机制前,先来谈谈一些基本相关的术语。 通信的同步(Synchronous):指向客户端发送...

LionSword
2014/06/22
0
0
Android 中Message,MessageQueue,Looper,Handle

一、几个关键概念 1、MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。 创建一个线程的时候,并不会自动创...

geek_loser
2015/10/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
38分钟前
1
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
0
0
890. Find and Replace Pattern - LeetCode

Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"abc ......

yysue
昨天
0
0
Linux | Redis

写在前面的话 常言道,不作笔记不读书。在下是深有体会啊,所以,跟我一起做下本节的笔记吧,或许多年以后,你一定会感谢今天的你。 安装 在官网的下载页 Redis Download 直接写了在Linux的安...

冯文议
昨天
1
0
NoSQL-memcached

NoSQL介绍 NoSQL叫非关系型数据库。而关系型数据库代表有MySQL。对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很...

ln97
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部