Handler使用方法总结
来源:互联网 发布:网络故障诊断工具 编辑:程序博客网 时间:2024/05/16 23:47
在看这篇博客之前,最好看看《Anroid异步消息机制(Handler、Looper、Message、MessageQueue)以及ThreadLocal运用》了解Handler原理。
Handler使用,主要有以下几种方式:
Thread+Handler、Timer+TimerTask+Handler、Handler.postXXX(Runnable r,...)、Handler.sendXXX()、AsyncTask。
1、activity_handler.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/handler_post_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="handler.post()" /> <TextView android:id="@+id/timer_handler_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Timer+TimerTask+Handler" /> <TextView android:id="@+id/thread_handler_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="thread+handler" /> <TextView android:id="@+id/asyncTask_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="asyncTask" /> <Button android:id="@+id/thread_handler_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="thread+handler" /> <Button android:id="@+id/asyncTask_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="asyncTask" /></LinearLayout>2、HandlerExample.java
import java.lang.ref.WeakReference;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class HandlerExample extends Activity {private TextView handler_post_text = null;private TextView timer_handler_text = null;private TextView thread_handler_text = null;private TextView asyncTask_text = null;private Button thread_handler_button = null;private Button asyncTask_button =null;private Handler handler;private Timer timer;private AsyncTask asyncTask;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler);//WeakReference<Handler> wf = new WeakReference<Handler>(new MyHandler());//handler = (wf != null) ? wf.get() : null;handler = new MyHandler();timer = new Timer();timer.schedule(new MyTimer(), 1, 5000);handler_post_text = (TextView) findViewById(R.id.handler_post_text);timer_handler_text = (TextView) findViewById(R.id.timer_handler_text);thread_handler_text = (TextView) findViewById(R.id.thread_handler_text);asyncTask_text = (TextView) findViewById(R.id.asyncTask_text);thread_handler_button = (Button) findViewById(R.id.thread_handler_button);asyncTask_button = (Button) findViewById(R.id.asyncTask_button);thread_handler_button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {new Thread(new Runnable() {@Overridepublic void run() {Message message = new Message();message.what = 2;handler.sendMessage(message);// handler.sendEmptyMessage(int what);// handler.sendEmptyMessageAtTime(int what, long uptimeMillis);//什么时间执行发送消息// handler.sendEmptyMessageDelayed(int what, long delayMillis);//延迟多少执行发送消息// handler.sendMessageAtTime(Message msg, long uptimeMillis);//什么时间执行发送消息// handler.sendMessageDelayed(Message msg, long uptimeMillis);//延迟多少执行发送消息}}).start();}});asyncTask_button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {asyncTask = new MyAsyncTask();//需要在UI线程中进行asyncTask.execute("hello world");//需要在UI线程中进行//asyncTask.execute(Runnable runnable);//asyncTask.execute(Object o);//asyncTask.execute(Object... params);}});handler.postAtTime(new Runnable() {@Overridepublic void run() {handler_post_text.setText("MainActivity.handler_post."+ Thread.currentThread().getName() + "-"+ Thread.currentThread().getId());}}, handler_post_text, SystemClock.uptimeMillis() + 4000);// 默认Message// handler.post(Runnable r);// handler.postAtTime(Runnable r, long uptimeMillis);//什么时间执行发送消息// handler.postDelayed(Runnable r, long uptimeMillis);//延迟多少执行发送消息}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}// 设置定时器任务class MyTimer extends TimerTask {@Overridepublic void run() {Message message = new Message();message.what = 1;handler.sendMessage(message);}}//onPreExecute->doInBackground->onProgressUpdate(需要doInBackground调用了publishProgress才能通过Handler触发)->onPostExecute(可无)//第一个参数是execute方法、doInBackground方法参数类型;//第二个参数是onProgressUpdate方法的参数类型;//第三个参数是onPostExecute方法的参数类型以及doInBackground返回参数类型class MyAsyncTask extends AsyncTask<Object, Integer, String>{@Overrideprotected void onPreExecute(){//可以ui更新asyncTask_text.setText("MainActivity.asyncTask."+ Thread.currentThread().getName() + "-"+ Thread.currentThread().getId());}@Overrideprotected String doInBackground(Object... arg0) {//可以执行耗时的任务,因而不能执行ui更新return "AsyncTask";}@Overrideprotected void onProgressUpdate(Integer... progresses){}@Overrideprotected void onPostExecute(String result){//更新ui,显示结果asyncTask_text.setText("AsyncTask");}@Overrideprotected void onCancelled(){//取消执行任务时,更新ui}}final class MyHandler extends Handler {@Overridepublic void handleMessage(Message message) {if (message.what == 1) {timer_handler_text.setText("MainActivity.timer_handler."+ Thread.currentThread().getName() + "-"+ Thread.currentThread().getId());} else if (message.what == 2) {thread_handler_text.setText("MainActivity.thread_handler."+ Thread.currentThread().getName() + "-"+ Thread.currentThread().getId());}}}@Overrideprotected void onStop() {super.onStop();}@Overrideprotected void onDestroy() {super.onDestroy();if (timer != null) {timer.cancel();}if (handler != null) {handler.removeCallbacksAndMessages(null);// 释放Handler}}@Overrideprotected void onResume() {super.onResume();}}3、AsyncTask
对Thread+Handler进行包装,更加流程化来处理UI。概括来说,当我们在UI线程中调用execute()方法后会调用onPreExecute()方法,然后由ThreadPoolExecutor实例sExecutor执行一个FutureTask任务,这个过程中doInBackground()方法将被调用,如果被开发者覆写的doInBackground()方法中调用了publishProgress()方法,则通过InternalHandler实例sHandler发送一条MESSAGE_POST_PROGRESS消息,更新进度;sHandler处理消息时onProgressUpdate()方法将被调用;如果遇到异常,则发送一条MESSAGE_POST_CANCEL的消息,取消任务,sHandler处理消息时onCancelled()方法将被调用;如果执行成功,则发送一条MESSAGE_POST_RESULT的消息,显示结果,sHandler处理消息时onPostExecute(Result result)方法被调用。
如下图所示:
- Handler使用方法总结
- Handler使用方法
- Handler 使用方法
- Handler使用方法
- Handler使用方法
- Handler使用方法
- HandlerThread,Handler,Thread使用方法
- HandlerThread,Handler,Thread使用方法
- Handler的基本使用方法
- HandlerThread,Handler,Thread使用方法
- 学习-Handler的使用方法
- HandlerThread,Handler,Thread使用方法
- HandlerThread,Handler,Thread使用方法
- Android Handler的使用方法
- HandlerThread,Handler,Thread使用方法
- 安卓 Handler使用方法
- android handler理解+使用方法
- HandlerThread,Handler,Thread使用方法
- IDEA配置Tomcat
- 妹子图APP(二)—— SwipeRefreshLayout实现下拉刷新上拉加载
- 解决 Windows instance 时间不同步问题
- 编程极简入门(python)-03-第一个python程序
- POJ1860 Currency Exchange(正权环,folyd)
- Handler使用方法总结
- glitch断言
- 项目笔记:点击按钮后使其保持点击时的状态
- 模板引擎
- 操作系统是如何工作的
- Java基盘环境搭建
- RealFlow在线教程翻译(11)——SPH
- c++第二次作业-3定期存款利息计算器
- NHibernate+FluentNHibernate+MySql 运行报错问题