Android进步之路十:Handler修改UI界面之Demo
来源:互联网 发布:c语言棱形 编辑:程序博客网 时间:2024/05/29 19:58
先大致说下步骤:
1:点击按纽的时候,把线程加入消息对列
2:在线程中,做进度变化的操作
3:由handler向主线程发送修改UI界面的消息
4:由handler负责处理消息并修改UI界面
以下是我自己亲测的小demo
package com.example.handlerprogressbardemo;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;/** * handler机制原理: * 点击开始按纽的时候,1:把线程加入消息对列里面,2:在子线程 里面做一些进度变化的显示。3:通过handler向主线程发送消息, * 请求修改UI界面,4:由handler负责处理消息,最终来修改UI界面。 * * */public class MainActivity extends Activity {private Handler handler;private Button mStartButton, mEndButton;private ProgressBar bar;//private Runnable updateBarThread;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initCom();}private void initCom() {bar = (ProgressBar) findViewById(R.id.progressBar);mStartButton = (Button) findViewById(R.id.button_start);mStartButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//第一次把线程加入消息对列handler.post(updateBarThread);}});handler = new Handler(){public void handleMessage(android.os.Message msg) {//handler更新UIbar.setProgress(msg.arg1);handler.post(updateBarThread);if(i>=100){bar.setProgress(0);//这里为什么要对i进行重新赋值啊,是因为,当进度大于100的时候,把进度条虽然清空了,但其实子线程还在//一直不停地走,而这时候i的值肯定是大于100的,所以会看不出效果,所以必须对i进行重新赋值,这样才会循//环操作i = 0;}};};mEndButton = (Button) findViewById(R.id.button_end);mEndButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {handler.removeCallbacks(updateBarThread);}});}private int i = 0;Runnable updateBarThread = new Runnable(){//int i = 0;int progress = 1;int count = 10;@Overridepublic void run() {//i = i + 2;i = i + 100/10;//i = i + progress/count;Message msg = handler.obtainMessage();//用arg1提高性能msg.arg1 = i;handler.sendMessage(msg);//睡眠0.5秒try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if(i>=100){handler.removeCallbacks(updateBarThread);}}};}
下面是引用网络的小demo:
Handler与Runnable
- public class MainActivity extends Activity
- {
- private Button mStartBtn,mEndBtn;
- private Handler mHandler;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- initCom();
- }
- private void initCom()
- {
- mHandler = new Handler();
- mStartBtn = (Button)findViewById(R.id.button_start);
- mStartBtn.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- //第一次加入消息队列
- mHandler.post(r);
- }
- });
- mEndBtn = (Button)findViewById(R.id.button_end);
- mEndBtn.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- mHandler.removeCallbacks(r);
- }
- });
- }
- Runnable r = new Runnable()
- {
- @Override
- public void run()
- {
- //要这些的操作,写在run()方法内部
- Log.e("-------", "------------");
- mHandler.postDelayed(r, 1000);
- }
- };
- }
用Handler更新UI
- public class MainActivity extends Activity
- {
- private Button mStartBtn;
- private ProgressBar bar;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- initCom();
- }
- private void initCom()
- {
- bar = (ProgressBar)findViewById(R.id.progressBar1);
- mStartBtn = (Button) findViewById(R.id.button_start);
- mStartBtn.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- // 第一次把线程加入消息队列
- handler.post(updateBarThread);
- }
- });
- }
- Handler handler = new Handler()
- {
- public void handleMessage(android.os.Message msg)
- {
- //handler更新UI
- bar.setProgress(msg.arg1);
- handler.post(updateBarThread);
- };
- };
- Runnable updateBarThread = new Runnable()
- {
- int i = 0;
- @Override
- public void run()
- {
- i = i + 10;
- Message msg = handler.obtainMessage();
- msg.arg1 = i;//用arg1,提高性能
- handler.sendMessage(msg );
- //睡眠1秒
- try
- {
- Thread.sleep(1000);
- }
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }
- if (i == 100)
- {
- handler.removeCallbacks(updateBarThread);
- }
- }
- };
- }
xml中进度条:
- <ProgressBar
- android:id="@+id/progressBar1"
- style="@android:style/Widget.ProgressBar.Horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
Timer与Handler:
- public class MainActivity extends Activity
- {
- protected static final int NUM_1 = 1;
- private TextView textView;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- initCom();
- }
- private void initCom()
- {
- textView = (TextView) findViewById(R.id.textView);
- Timer timer = new Timer();
- timer.schedule(new TimerTask()
- {
- @Override
- public void run()
- {
- Message msg = new Message();
- msg.arg1 = 1;
- handler.sendMessage(msg);
- }
- }, 2000);
- }
- Handler handler = new Handler()
- {
- public void handleMessage(android.os.Message msg)
- {
- // handler更新UI
- switch (msg.arg1)
- {
- case NUM_1:
- textView.setText("test");
- break;
- default:
- break;
- }
- };
- };
- }
0 0
- Android进步之路十:Handler修改UI界面之Demo
- Android UI界面更新之Handler
- Android进步之路七:handler机制原理
- Android多线程:Handler应用之更新UI界面
- Android之UI更新--Handler
- android之handler更新UI
- Android UI界面之TableLayout
- Android进步之路九:Handler出现的原因,特点以及实例
- Android Handler使用详解之UI更新
- Android之Handler更新UI总结
- Android开发学习之路--UI之简单聊天界面
- Android开发学习之路--UI之简单聊天界面
- Android之UI学习篇十:使用TabHost实现微博客户端界面
- Android进步之路五:startActivityForResult详解
- Android界面编程之十 菜单
- android 滑动引导界面,UI 学习之路一
- Android -- UI界面之threme和style
- Android UI 之 Tab类型界面总结
- windows套接字编程过程
- LeetCode Unique Paths(dp)
- WCF错误:413 Request Entity Too Large
- CocoaPods的安装和使用
- c++智能指针:auto_ptr shared_ptr
- Android进步之路十:Handler修改UI界面之Demo
- TableViewCell高度自适应的实现方案
- 黑马程序员——Java高新技术_反射
- asynctask 异步线程类进行多线程操作
- Kth Largest Element in an Array
- UML之类图
- Auto Layout 使用心得
- C++中Static作用和使用方法
- 4.4-1