Android开发之handler(二)
2015-06-22 11:30
609 查看
之前学习了handler的简单用法,如果还不知道handler是什么,可以看一下点击打开链接。这次深入一下,还是一样,先来看一下执行的效果
main.xml
[html] view
plaincopy
<?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"
>
<ProgressBar
android:id="@+id/bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:visibility="gone"
/>
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="start"
/>
</LinearLayout>
activity类
[java] view
plaincopy
package com.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
public class progressHandler extends Activity {
/** Called when the activity is first created. */
private ProgressBar bar = null;
private Button btn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar)findViewById(R.id.bar);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new MyListener());
}
class MyListener implements OnClickListener{
@Override
public void onClick(View arg0) {//第一步,触发button事件,把线程对象updateThread 添加到线程消息队列中
// TODO Auto-generated method stub
bar.setVisibility(View.VISIBLE);
handler.post(updateThread);
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {//第五步,处理子线程发过来的消息
// TODO Auto-generated method stub
super.handleMessage(msg);
bar.setProgress(msg.arg1);
handler.post(updateThread);//继续调用子线程
}
};
Runnable updateThread = new Runnable(){
int i = 0;
@Override
public void run() {//第二步,启动线程
// TODO Auto-generated method stub
System.out.println("begin a thread");
i += 10;
Message msg = handler.obtainMessage();//第三步,从消息池中返回一个消息
msg.arg1 = i;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendMessage(msg);//第四步,从子线程发送消息给主线程
//也可以使用这种方式发送,也是默认发送this.handler
//message.sendToTarget();
if(i==100){//第五步,判断i的值(由于handler是异步处理消息,所以同时会处理子线程发送给主线程的消息)
handler.removeCallbacks(updateThread);
bar.setVisibility(View.GONE);
Toast.makeText(progressHandler.this, "你个SB!", Toast.LENGTH_LONG).show();
}
}
};
}
main.xml
[html] view
plaincopy
<?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"
>
<ProgressBar
android:id="@+id/bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleHorizontal"
android:visibility="gone"
/>
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="start"
/>
</LinearLayout>
activity类
[java] view
plaincopy
package com.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
public class progressHandler extends Activity {
/** Called when the activity is first created. */
private ProgressBar bar = null;
private Button btn = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar)findViewById(R.id.bar);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new MyListener());
}
class MyListener implements OnClickListener{
@Override
public void onClick(View arg0) {//第一步,触发button事件,把线程对象updateThread 添加到线程消息队列中
// TODO Auto-generated method stub
bar.setVisibility(View.VISIBLE);
handler.post(updateThread);
}
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {//第五步,处理子线程发过来的消息
// TODO Auto-generated method stub
super.handleMessage(msg);
bar.setProgress(msg.arg1);
handler.post(updateThread);//继续调用子线程
}
};
Runnable updateThread = new Runnable(){
int i = 0;
@Override
public void run() {//第二步,启动线程
// TODO Auto-generated method stub
System.out.println("begin a thread");
i += 10;
Message msg = handler.obtainMessage();//第三步,从消息池中返回一个消息
msg.arg1 = i;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendMessage(msg);//第四步,从子线程发送消息给主线程
//也可以使用这种方式发送,也是默认发送this.handler
//message.sendToTarget();
if(i==100){//第五步,判断i的值(由于handler是异步处理消息,所以同时会处理子线程发送给主线程的消息)
handler.removeCallbacks(updateThread);
bar.setVisibility(View.GONE);
Toast.makeText(progressHandler.this, "你个SB!", Toast.LENGTH_LONG).show();
}
}
};
}
相关文章推荐
- AsyncTask(异步任务)讲解-android的学习之旅(四十六)
- AsyncTask(异步任务)讲解-android的学习之旅(四十六)
- AsyncTask(异步任务)讲解-android的学习之旅(四十六)
- Android中自定义属性(attrs.xml,TypedArray的使用)
- Android Studio Gradle 添加.so 支持文件
- android imageloader
- Android开发之handler(0)
- android百度地图 SDK v3.5.0
- Android系统框架学习总结
- Android Bitmap与String互转
- Android图像处理之Bitmap类
- Androidclient和server第一种方法端数据交换
- android的activity总结
- 深入理解Android的startservice和bindservice
- android用pull解析xml文件
- Android中的消息处理实例与分析
- Android活动组件的基本用法
- 如何学好Android之我见
- [原创]推荐几个我使用的Android软件
- Android属性动画备忘