package com.shizhefei.test.controllers.task; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.widget.TextView; import com.shizhefei.view.mvc.demo.R; import java.lang.ref.WeakReference; /** * Created by luckyjayce on 2017/4/15. */ public class TestNormalTaskActivity extends Activity { private View threadButton; private View asyTaskButton; private TextView resultTextView; private StaticHandler staticHandler; private SelfHandler selfHandler; private View threadWeakButton; private SelfAsyncTask selfInterruptAsyncTask; private SelfAsyncTask selfAsyncTask; private View staticThreadWeakButton; private View interruptAsyTaskButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_normaltask); threadButton = findViewById(R.id.normalTask_thread_button); threadWeakButton = findViewById(R.id.normalTask_threadWeak_button); staticThreadWeakButton = findViewById(R.id.normalTask_staticThreadWeak_button); interruptAsyTaskButton = findViewById(R.id.normalTask_interruptAsyTask_button); asyTaskButton = findViewById(R.id.normalTask_asyTask_button); resultTextView = (TextView) findViewById(R.id.normalTask_result2_textView); staticHandler = new StaticHandler(resultTextView); selfHandler = new SelfHandler(); staticThreadWeakButton.setOnClickListener(onClickListener); threadButton.setOnClickListener(onClickListener); threadWeakButton.setOnClickListener(onClickListener); asyTaskButton.setOnClickListener(onClickListener); interruptAsyTaskButton.setOnClickListener(onClickListener); } @Override protected void onDestroy() { super.onDestroy(); if (selfInterruptAsyncTask != null) { selfInterruptAsyncTask.cancel(true); } if (selfAsyncTask != null) { selfAsyncTask.cancel(false); } } private View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (v == threadButton) {//测试Thread+ 静态Handler方式 new Thread() { @Override public void run() { super.run(); try { staticHandler.sendMessage(staticHandler.obtainMessage(WHAT_START)); for (int i = 0; i < 20; i++) { Thread.sleep(1000); Log.d("zzzz", "threadButton progress:" + i); staticHandler.sendMessage(staticHandler.obtainMessage(WHAT_PROGRESS, i)); } staticHandler.sendMessage(staticHandler.obtainMessage(WHAT_SUCCESS, "完成")); } catch (Exception e) { e.printStackTrace(); staticHandler.sendMessage(staticHandler.obtainMessage(WHAT_EXCEPTION, e)); } } }.start(); } else if (v == threadWeakButton) {//测试Thread+ 内部类Handler+WeakReference方式 new Thread() { @Override public void run() { super.run(); try { selfHandler.sendMessage(selfHandler.obtainMessage(WHAT_START)); for (int i = 0; i < 20; i++) { Thread.sleep(1000); Log.d("zzzz", "threadButton progress:" + i); selfHandler.sendMessage(selfHandler.obtainMessage(WHAT_PROGRESS, i)); } selfHandler.sendMessage(selfHandler.obtainMessage(WHAT_SUCCESS, "完成")); } catch (Exception e) { e.printStackTrace(); selfHandler.sendMessage(selfHandler.obtainMessage(WHAT_EXCEPTION, e)); } } }.start(); } else if (v == staticThreadWeakButton) {//静态Thread+静态Handler+WeakReference方式 new LongTimeThread(staticHandler).start(); } else if (v == asyTaskButton) {// 内部类asyncTask 没有Interrupt selfAsyncTask = new SelfAsyncTask(); selfAsyncTask.execute(); } else if (v == interruptAsyTaskButton) {//内部类asyncTask Interrupt selfInterruptAsyncTask = new SelfAsyncTask(); selfInterruptAsyncTask.execute(); } //还有静态asyncTask + WeakReference方式 //静态asyncTask + cancel的时候置空引用对象 } }; private static final int WHAT_START = 0; private static final int WHAT_PROGRESS = 1; private static final int WHAT_SUCCESS = 2; private static final int WHAT_EXCEPTION = 3; private static class StaticHandler extends Handler { private WeakReference<TextView> weakReference; public StaticHandler(TextView textView) { this.weakReference = new WeakReference<>(textView); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); TextView textView = weakReference.get(); if (textView == null) { return; } switch (msg.what) { case WHAT_START: textView.setText("开始:"); break; case WHAT_EXCEPTION: textView.append("\n异常:" + msg.obj); break; case WHAT_SUCCESS: textView.append("\nsuccess:" + msg.obj); break; case WHAT_PROGRESS: textView.append("\nprogress:" + msg.obj); break; } } } private class SelfHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case WHAT_START: resultTextView.setText("开始:"); break; case WHAT_EXCEPTION: resultTextView.append("\n异常:" + msg.obj); break; case WHAT_SUCCESS: resultTextView.append("\nsuccess:" + msg.obj); break; case WHAT_PROGRESS: resultTextView.append("\nprogress:" + msg.obj); break; } } } private class SelfAsyncTask extends AsyncTask<Void, Integer, String> { private volatile Exception exception; @Override protected void onPreExecute() { super.onPreExecute(); resultTextView.append("开始AsyncTask:"); } @Override protected String doInBackground(Void... params) { try { for (int i = 0; i < 20; i++) { Thread.sleep(1000); Log.d("zzzz", "AsyncLinkTask progress:" + i); publishProgress(i); } return "完成"; } catch (Exception e) { e.printStackTrace(); this.exception = e; } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); resultTextView.append("\nAsyncLinkTask progress:"); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); if (exception != null) { resultTextView.append("\nAsyncLinkTask exception:" + exception); } else { resultTextView.append("\nAsyncLinkTask 结果:" + s); } } } private static class LongTimeThread extends Thread { public LongTimeThread(Handler leakMyHandler) { this.leakMyHandler = leakMyHandler; } private Handler leakMyHandler; @Override public void run() { super.run(); try { leakMyHandler.sendMessage(leakMyHandler.obtainMessage(WHAT_START)); for (int i = 0; i < 20; i++) { Thread.sleep(1000); Log.d("zzzz", "threadButton progress:" + i); leakMyHandler.sendMessage(leakMyHandler.obtainMessage(WHAT_PROGRESS, i)); } leakMyHandler.sendMessage(leakMyHandler.obtainMessage(WHAT_SUCCESS, "完成")); } catch (Exception e) { e.printStackTrace(); leakMyHandler.sendMessage(leakMyHandler.obtainMessage(WHAT_EXCEPTION, e)); } } } }