直接上代码,不解说 - -
基于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 {
protected ExecutorService mExecutorService;
private WeakReference mContextWeakReference;
protected HandlerInner mHandler;
protected static class HandlerInner extends Handler {
private WeakReference> mWeakReference;
public HandlerInner(AbsHandlerThreadHelper handlerThreadHelper) {
super();
this.mWeakReference = new WeakReference>(handlerThreadHelper);
}
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
AbsHandlerThreadHelper handlerThreadHelper = mWeakReference.get();
if (handlerThreadHelper != null) {
handlerThreadHelper.dispatchMessage(msg);
}
}
}
public AbsHandlerThreadHelper(T t) {
super();
this.mContextWeakReference = new WeakReference(t);
init();
}
private void init() {
mExecutorService = Executors.newCachedThreadPool();
mHandler = new HandlerInner(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 implements Runnable {
protected WeakReference> mReference;
public AbsThread(AbsHandlerThreadHelper handlerThreadHelper) {
super();
this.mReference = new WeakReference>(handlerThreadHelper);
}
@Override
public void run() {
synchronized (this) {
AbsHandlerThreadHelper 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 extends AbsThread implements Callback {
private int success = 0;
private int fail = -1;
public AbsOkHttpThread(AbsHandlerThreadHelper handlerThreadHelper) {
super(handlerThreadHelper);
}
public AbsOkHttpThread(AbsHandlerThreadHelper handlerThreadHelper, int success, int fail) {
super(handlerThreadHelper);
this.success = success;
this.fail = fail;
}
@Override
public void onFailure(Call call, IOException exception) {
AbsHandlerThreadHelper handlerThreadHelper = mReference.get();
if (handlerThreadHelper != null) {
handlerThreadHelper.mHandler.sendEmptyMessage(fail);
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
try {
AbsHandlerThreadHelper 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 {
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 {
public TestRun(AbsHandlerThreadHelper handlerThreadHelper, int success, int fail) {
super(handlerThreadHelper, success, fail);
}
@Override
public void runPro() {
AbsHandlerThreadHelper absHandlerThreadHelper = mReference.get();
Service context = absHandlerThreadHelper.getContext();
if (context != null) {
OkHttp3Utils.getInstance(context).doPostPro("http://www.google.com", null, "{}", this);
}
}
}
}