9、实现自定义AsyncTask
来源:互联网 发布:sql统计个数 编辑:程序博客网 时间:2024/05/09 01:20
一、自定义AsyncTask。
package com.example.asynctask;import java.util.ArrayDeque;import java.util.concurrent.BlockingQueue;import java.util.concurrent.Callable;import java.util.concurrent.CancellationException;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executor;import java.util.concurrent.FutureTask;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadFactory;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicBoolean;import android.os.Handler;import android.os.Looper;import android.text.TextUtils;public abstract class CustomAsyncTask<Params, T, Result> {public static class AsyncTaskBaseParam { public int operation;}ThreadPoolExecutor mThreadPoolExecutor;BlockingQueue<Runnable> mBlockingQueue;AtomicBoolean mTaskCancel;Handler mUIHandler;Executor mExecutor;private String mThreadName;public CustomAsyncTask() { this(1, false);}public CustomAsyncTask(int threadCount, boolean isSerial) { this(1,threadCount, isSerial, null);}public CustomAsyncTask(int coreThreadCount, int maxThreadCount, boolean isSerial, String poolName) { if (TextUtils.isEmpty(poolName)) { mThreadName = getClass().getSimpleName(); } else { mThreadName = poolName; } mUIHandler = new Handler(Looper.getMainLooper()); mBlockingQueue = new LinkedBlockingQueue<Runnable>(); mThreadPoolExecutor = new ThreadPoolExecutor(coreThreadCount, maxThreadCount, 1, TimeUnit.SECONDS, mBlockingQueue, new CustomThreadFactory(mThreadName)); mThreadPoolExecutor.allowCoreThreadTimeOut(true); if (isSerial) { mExecutor = new SerialExecutor(mThreadPoolExecutor); } else { mExecutor = mThreadPoolExecutor; }}public CustomAsyncTask<Params, T, Result> execute(Params... params) { onPreExecute(); mExecutor.execute(new FutureTask<Result>(new WorkerRunnable(params)) { @Override protected void done() { super.done(); try { postResult(get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { throw new RuntimeException("An error occured while executing CustomAsyncTask doInBackground()", e.getCause()); } catch (CancellationException e) { } } }); return this; }protected Result postResult(final Result result) { mUIHandler.post(new Runnable() { @Override public void run() { onPostExecute(result); } }); return result;}protected void onPreExecute() {}protected abstract Result doInBackground(Params...params);protected void onPostExecute(Result r) {}class WorkerRunnable implements Callable<Result> { WorkerRunnable(Params... p) { mParams = p; } Params[] mParams; @Override public Result call() throws Exception { android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); final Result r = doInBackground(mParams); return r; }}static class CustomThreadFactory implements ThreadFactory { private String mThreadNamePattern; private int mThreadOrder; public CustomThreadFactory(String name) { mThreadNamePattern = name; mThreadOrder = 0; }@Overridepublic Thread newThread(Runnable runnable) { Thread thread = new Thread(runnable, makeName()); thread.setPriority(Thread.MIN_PRIORITY); return thread; } String makeName() { StringBuilder sb = new StringBuilder(); sb.append(mThreadNamePattern); sb.append(" ").append(mThreadOrder++); return sb.toString(); }}static class SerialExecutor implements Executor { final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>(); Runnable mActive; Executor mRealExecutor; SerialExecutor(Executor realExecutor) { mRealExecutor = realExecutor; } public synchronized void execute(final Runnable r) { mTasks.offer(new Runnable() { public void run() { try { r.run(); } finally { scheduleNext(); } } }); if (mActive == null) { scheduleNext(); } } protected synchronized void scheduleNext() { if ((mActive = mTasks.poll()) != null) { if (mRealExecutor != null) { mRealExecutor.execute(mActive); } } } }}
二、使用AsyncTask。
1、定义LoadParams,ResultParams。
class LoadParams { int op; ...}
class ResultParams { int op;}
2、定义一个类继承CustomAsyncTask。
private class LoadDataTask extend CustomAsyncTask<LoadParams, Void, ResultParams> { @Override protected void onPreExecute() { //主线程,在DoinBackGround之前执行。 } @Override protected ResultParamsdoInBackground(LoadParams... params) { LoadParams loadParams = params[0]; ResultParams result = new ResultParams(); int op = loadParams .op; switch(op) { case xx: break; case xx: break; } return result ; } @Override protected void onPostExecute(Boolean result) { //主线程,在DoinBackGround之后执行 }}
3、执行任务。
LoadParams parasm = new LoadParams();new LoadDataTask().excute(params);
0 0
- 9、实现自定义AsyncTask
- AsyncTask解析(下)——实现自定义AsyncTask网络传输工具类封装
- 自定义异步AsyncTask
- 实现异步处理----AsyncTask
- AsyncTask实现代码原理
- AsyncTask 实现异步刷新
- AsyncTask实现代码原理
- AsyncTask的实现原理
- AsyncTask实现代码原理
- 用AsyncTask实现多线程
- AsyncTask实现的原理
- AsyncTask的实现原理
- AsyncTask实现断点续传
- AsyncTask实现原理
- AsyncTask的实现机制
- AsyncTask的实现
- Android AsyncTask实现断点续传
- android 自己实现 AsyncTask
- checkio-house password
- JAVA并发编程笔记三
- POJ3026 BFS+kruskal
- BestCoder Round #66 (div.2)1001 GTW likes math HDU5595
- NDK下断点调试
- 9、实现自定义AsyncTask
- Android中设置启动动画
- Android:StrictMode(严苛模式)
- Android笔记(5) ---DateAndTime控件以及Dialog
- Android
- ucosIII 软件定时器
- Ubuntu搭建OpenGrok
- 数据结构期末总结
- 开灯问题