<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_gravity="center"
android:id="@+id/txt" />
<Button android:id="@+id/btnStartTime" android:text="开始计时"
android:layout_width="80dip" android:layout_height="wrap_content"></Button>
<Button android:id="@+id/btnStopTime" android:text="停止计时"
android:layout_width="80dip" android:layout_height="wrap_content" />
<SeekBar android:layout_height="wrap_content"
android:layout_width="fill_parent" android:id="@+id/SeekBar01"></SeekBar>
</LinearLayout>
本例子通过Thread来模拟Handler的功能,利用Thread.sleep(1000)来
模拟1seconds,而每隔1s,Handler都会将当前剩余时间发到消息队列中,
Handler的构造函数之一Handler(Handler.CallBack),实现Handler.CallBack
中的handleMessage方法就能够获取Handler发出的消息。
HandlerExampleActivity01.java
package kping.example;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class HandlerExampleActivity01 extends Activity implements
Handler.Callback, Button.OnClickListener {
final static String TAG = "HandlerExampleActivity01";
TextView txt;
Button btnStart;
Button btnStop;
Handler myHandler;
TimerThread timerThread;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupView();
}
public void setupView() {
txt = (TextView) findViewById(R.id.txt);
btnStart = (Button) findViewById(R.id.btnStartTime);
btnStop = (Button) findViewById(R.id.btnStopTime);
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
// Handler的构造函数之一Handler(Handler.Callback callback),所以HandlerExampleAcitivity01要实现
//Handler.CallBack,从而实现handleMessage
myHandler = new Handler(this);
//打印主线程的id号
Log.d(TAG, "ThreadId:" + String.valueOf(Thread.currentThread().getId()));
}
// implements Handler.CallBack
public boolean handleMessage(Message msg) {
switch (msg.what) {
case 0:
Bundle data = msg.getData();
txt.setText(String.valueOf(data.getInt("time")));
Log.d("ThreadId",
"HandleMessage:"
+ String.valueOf(Thread.currentThread().getId()));
Log.d("ThreadId", "msgData:" + String.valueOf(data.getInt("time")));
break;
}
return false;
}
// implements Button.OnClickListener
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnStartTime:
timerThread = new TimerThread(myHandler, 60);
timerThread.start();
break;
case R.id.btnStopTime:
timerThread.stop();
break;
}
}
}
TimerThread.java
package kping.example;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class TimerThread extends Thread {
private final static String TAG = "TimerThread";
private Handler handler;
private int total;
public TimerThread(Handler handler, int total) {
this.handler = handler;
this.total = total;
}
public void run() {
while (true) {
if(total < 0)
break;
Message msg = new Message();
Bundle data = new Bundle();
data.putInt("time", total);
msg.setData(data);
msg.what = 0;
Log.d(TAG, "ThreadId:" + String.valueOf(Thread.currentThread().getId()));
handler.sendMessage(msg);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
}
}
}
黄条是检测当前UI是否阻塞,后面有用到
ps:
这里stop按钮不起作用,可以给他设置个flag=false,需要添加一下逻辑,
另外start多按几下,logcat相应也会多出几个线程,程序要完善点,就对
timerThread添加些逻辑,若为null,才新建对象。不过这些不是重点,handler
大概意思传递到了就好
Scheduling messages is accomplished with the post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long) methods. The post versions allow you to enqueue Runnable objects to be called by the message queue when they are received; the sendMessage versions allow you to enqueue a Message object containing a bundle of data that will be processed by the Handler's handleMessage(Message) method (requiring that you implement a subclass of Handler).
上述字段摘自API中Handler的类说明
大致意思:可以有post(Runnable) sendMessage(Message)两种方法传递信息,其他都是在此基础上添加时间限制
下面再来一个例子,这里我们用内部类来实现Handler,所以不需要实现Handler.CallBack.当然post(Runnable)暗示主类要实现Runnable,与刚刚例子相比可以将TimerThread类撤掉,将记时功能也移至主类当中
HandlerExampleActivity02.java
package kping.example;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class HandlerExampleActivity02 extends Activity implements
Button.OnClickListener{
private final static String TAG = "HandlerExampleActivity02";
private TextView txt;
private Button btnStart;
private Button btnStop;
private int total = 8;
private final Handler myHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
Bundle data = msg.getData();
txt.setText(String.valueOf(data.getInt("time")));
Log.d(TAG, data.getInt("time") + "");
break;
}
}
};
private final Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
if (total < 0)
break;
Message msg = new Message();
Bundle data = new Bundle();
data.putInt("time", total);
msg.setData(data);
msg.what = 0;
myHandler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
total--;
}
}
};
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupView();
}
public void setupView() {
txt = (TextView) findViewById(R.id.txt);
btnStart = (Button) findViewById(R.id.btnStartTime);
btnStop = (Button) findViewById(R.id.btnStopTime);
btnStart.setOnClickListener(this);
btnStop.setOnClickListener(this);
}
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnStartTime:
myHandler.post(runnable); //触发run()
break;
case R.id.btnStopTime:
myHandler.removeCallbacks(runnable);
break;
}
}
}
之前我运行这个例子的时候一度以为出问题了,其实Thread.sleep()把主线程给睡了,把total设为60直接force close,令total=10还行,不过textView不会显示10,9,8.....而是10秒后直接显示0;logcat也是在10s后将10,9....0打印出来。这个例子其实可以优化,下面是我网上看到的一个例子。
HandlerExampleActivity03.java
package kping.example;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class HandlerExampleActivity03 extends Activity {
/** Called when the activity is first created. */
private Button butStart;
private Button butStop;
TextView tv;
int i = 0;
Handler handler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Handler在那个Activity中new的就且仅属于那个Activity的
butStart = (Button) findViewById(R.id.btnStartTime);
butStop = (Button) findViewById(R.id.btnStopTime);
tv = (TextView) findViewById(R.id.txt);
butStart.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
handler.post(runnable);
}
});
butStop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
handler.removeCallbacks(runnable);
}
});
}
Runnable runnable = new Runnable() {
public void run() {
tv.setText(String.valueOf(i++));
handler.postDelayed(runnable, 1000);
}
};
}
这个例子很清爽,之前用计数器弱爆了..
分享到:
相关推荐
在工作线程中,通过`Handler`的`sendMessage()`或`post(Runnable)`方法发送消息或Runnable对象。`Message`对象可以携带数据,方便在主线程中进行处理。例如: ```java Message msg = new Message(); msg.what = ...
2. 使用`Handler`发送消息:在其他线程(如AsyncTask或Thread)中,通过`handler.sendMessage(msg)`或`handler.post(runnable)`将任务提交到UI线程。 3. `Looper`的使用:可能在自定义线程中初始化并启动`Looper`,...
现在,让我们来看一个简单的Handler Demo: ```java // 主线程的Handler public class MainActivity extends AppCompatActivity { private Handler mainHandler = new Handler() { @Override public void ...
本示例中的“android demo”就是关于如何利用Handler的`postDelayed`方法和`Runnable`接口来实现一个延时3秒的Splash Screen。下面将详细解释这个过程以及涉及的技术点。 1. **Handler**: Handler是Android中处理...
`Handler`通常与`AsyncTask`、`Thread`、`Runnable`等配合使用,实现复杂的异步操作。例如,当在子线程中完成耗时操作后,可以通过`Handler`更新UI,确保操作始终在主线程进行。 总结来说,`Handler`是Android异步...
在Android开发中,`Handler`是一个至关重要的组件,它用于在主线程中处理来自其他线程的消息,确保UI...`HandlerDemo`项目提供了一个实践和学习`Handler`机制的良好平台,通过实际操作,可以更深入地理解其工作原理。
本示例的`android demo`旨在演示如何利用`Runnable`和`Handler`来实现一个每3秒执行一次的任务,这在需要定期更新UI或执行周期性操作的场景下非常有用。现在我们将详细探讨这两个组件以及它们如何协同工作。 首先,...
本示例项目"HandlerDemo"深入探讨了`Handler`的使用条件和应用场景。 首先,理解`Handler`的基本概念。`Handler`是Android消息处理机制的一部分,它与`Looper`和`Message`共同协作,实现线程间的通信。当在后台线程...
本示例"Handler_Demo"旨在演示如何解决在后台线程中更新Android UI的问题。 首先,我们需要理解Android的线程模型。默认情况下,所有Android应用的入口点`Activity`都在主线程运行,这个线程负责处理用户交互和UI...
"HandlerDemo.zip"提供的示例就是展示了如何优雅地使用`Handler`来处理这类问题,同时遵循阿里的编码规范。 `Handler`的核心概念包括三个部分:`Handler`、`Message`和`Looper`。首先,`Looper`是消息循环器,它...
本示例“Android Handler传值的demo”将帮助我们深入理解这一机制。 `Handler`是一个Android中的核心组件,它的主要作用是处理来自其他线程的消息,通常是在主线程中。它通过发送`Message`对象来执行特定的操作或...
在Android开发中,`Handler`是一个至关重要的组件,主要用于处理线程间的通信,尤其是在主线程与工作线程之间。...通过学习这个demo,你可以更好地理解`Handler`的工作机制,并将其应用到自己的项目中。
在Android应用开发中,Handler、Looper和Message是实现线程间通信的重要机制。...通过学习和实践这个Demo,开发者可以更好地理解和掌握Android中线程间通信的技巧,提高应用程序的性能和用户体验。
`Handler`类主要用于发送和处理消息,`Thread`用于开启新的执行线程,而`post()`方法则是`Handler`的一个关键函数,常用于将一个Runnable对象放入消息队列,待UI线程空闲时执行。下面我们将深入探讨这些知识点。 ...
`HandlerDemo.7z`这个压缩包文件很可能包含了一个示例项目,演示了如何使用`Handler`进行这种通信,以及如何通过弱引用来防止内存泄漏。下面我们将详细探讨`Handler`机制及其在处理内存溢出问题中的应用。 首先,...
通过`sendMessage()`或`post()`方法,`Handler`可以发送`Message`或`Runnable`到消息队列,等待`Looper`来处理。`Handler`还可以定义不同类型的回调方法,如`handleMessage(Message msg)`,当对应的消息被取出处理时...
本Android演示项目("android demo")旨在展示如何在Android应用程序中有效地利用Runnable来实现异步操作。 首先,我们需要理解Android主线程,也被称为UI线程,它负责处理用户界面的更新和事件响应。如果在主线程...
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能...