多线程实现Android更新进度条
16lz
2021-12-04
您的评价: | 力荐 | 收藏该经验 |
多线程实现更新android进度条。
实例教程,详细信息我已经注释
查看源码 打印 ? 01 | package com.shougao.hello; |
02 |
03 | import android.app.Activity; |
04 | import android.os.Bundle; |
05 | import android.os.Handler; |
06 | import android.os.Message; |
07 | import android.view.View; |
08 | import android.view.View.OnClickListener; |
09 | import android.widget.Button; |
10 | import android.widget.ProgressBar; |
11 |
12 | public class HelloActivity extends Activity { |
13 |
/** Called when the activity is first created. */ |
14 |
15 |
private ProgressBar progressBar; |
16 |
private Button startButton; |
17 |
18 |
@Override |
19 |
public void onCreate(Bundle savedInstanceState) { |
20 |
super .onCreate(savedInstanceState); |
21 |
setContentView(R.layout.main); |
22 |
23 |
progressBar = (ProgressBar) findViewById(R.id.progressbar); |
24 |
startButton = (Button) findViewById(R.id.startButton); |
25 |
26 |
startButton.setOnClickListener( new ProgressBarOnClickListener()); |
27 |
} |
28 |
29 |
class ProgressBarOnClickListener implements OnClickListener { |
30 |
public void onClick(View v) { |
31 |
// 设置进度条为可见状态 |
32 |
progressBar.setVisibility(View.VISIBLE); |
33 |
// 添加updataThread到消息队列 |
34 |
updateBarHandler.post(updateThread); |
35 |
} |
36 |
} |
37 |
38 |
// 使用匿名内部类来复写Handler当中的handlerMessage()方法 |
39 |
// 这个handler是需要反复执行的,直到消息队列中没有Message为止。 |
40 |
// 执行过程中把进度条就刷新了。 |
41 |
Handler updateBarHandler = new Handler() { |
42 |
@Override |
43 |
public void handleMessage(Message msg) { |
44 |
System.out.println( "----------start handle" ); |
45 |
progressBar.setProgress(msg.arg1); |
46 |
updateBarHandler.post(updateThread); // 将要执行的线程放入到队列当中 |
47 |
} |
48 |
}; |
49 |
50 |
// 线程类,该类使用匿名内部类的方式进行声明 |
51 |
Runnable updateThread = new Runnable() { |
52 |
int i = 0 ; |
53 |
54 |
public void run() { |
55 |
// TODO Auto-generated method stub |
56 |
System.out.println( "----------Begin Thread" ); |
57 |
i += 20 ; |
58 |
// 得到一个消息对象,Message类是android系统提供的 |
59 |
Message msg = updateBarHandler.obtainMessage(); |
60 |
// 将Message对象的arg1参数的值设置为i |
61 |
msg.arg1 = i; // 用arg1、arg2这两个成员变量传递消息,优点是系统性能消耗较少 |
62 |
try { |
63 |
Thread.sleep( 3000 ); // 让当前线程休眠1000毫秒 |
64 |
} catch (InterruptedException ex) { |
65 |
ex.printStackTrace(); |
66 |
} |
67 |
// 将Message对象加入到消息队列当中,等下次looper调用消息队列时,使用这个message显示进度条 |
68 |
// 或者说,把增加了10%的进度信息Message放到updateBarHandler的队列中。 |
69 |
if (i < 101 ){ |
70 |
updateBarHandler.sendMessage(msg); |
71 |
} |
72 |
// 如果i的值等于100 |
73 |
if (i == 100 ) { |
74 |
// 将线程对象从队列中移除 |
75 |
updateBarHandler.removeCallbacks(updateThread); |
76 |
} |
77 |
} |
78 |
}; |
79 | } |
更多相关文章
- android Sqlite多线程访问异常解决方案
- 【Android】从源码中探讨Handler机制
- Android(安卓)-- Wifi连接流程分析
- Android(安卓)Handler揭秘(三)
- Android中有关Handler的使用(二)
- Android中Handler引起的内存泄露
- Android中有关Handler的使用(二)
- Android平台开发-Android(安卓)keypad map-Android按键事件
- Android进程和线程(Android开发指南--译)