Android解决:使用多线程和Handler同步更新UI
扫描二维码
随时随地手机看文章
如果运行时,可以看到滚动条由条慢慢变短,则说明程序成功了。截图如下,建议选择大点的文件做测试。
2. [图片] 2.jpg
3. [代码]main.xml布局文件
01 |
<? xml version = "1.0" encoding = "utf-8" ?> |
02 |
< ScrollView |
03 |
xmlns:Android = "http://schemas.android.com/apk/res/android" |
04 |
Android:layout_height = "wrap_content" android:id = "@+id/scrollView1" android:layout_width = "fill_parent" > |
05 |
< LinearLayout Android:id = "@+id/linearLayout1" |
06 |
Android:orientation = "vertical" |
07 |
Android:layout_width = "fill_parent" |
08 |
Android:layout_height = "wrap_content" > |
09 |
< TextView |
10 |
Android:id = "@+id/tv" |
11 |
Android:layout_width = "fill_parent" |
12 |
Android:layout_height = "wrap_content" |
13 |
/> |
14 |
</ LinearLayout > |
15 |
</ ScrollView > |
4. [代码]FileRead.java
01 |
public class FileRead { |
02 |
boolean readend= false ; |
03 |
List<String> al= null ; |
04 |
public class ReadNodesThread extends Thread{ //读取线程 |
05 |
06 |
public void run() |
07 |
{ |
08 |
al= new ArrayList<String>( 100 ); |
09 |
al.clear(); |
10 |
readend= false ; |
11 |
int i= 0 ; |
12 |
try { |
13 |
RandomAccessFile raf= new RandomAccessFile( "/sdcard/test.txt" , "r" ); |
14 |
//try { |
15 |
while (raf.getFilePointer()<raf.length()) |
16 |
{ |
17 |
al.add(raf.readLine()); |
18 |
//sleep(100);//如果测试文件太小,这里休眠是为了测试, |
19 |
} |
20 |
21 |
} catch (Exception e1) { |
22 |
// TODO Auto-generated catch block |
23 |
e1.printStackTrace(); |
24 |
} |
25 |
readend= true ; |
26 |
} |
27 |
}; |
28 |
} |
5. [代码]MultiThreadActivity.java
01 |
public class MultiThreadActivity extends Activity { |
02 |
FileRead fr= null ; |
03 |
Handler mHandler= null ; |
04 |
int curi= 0 ; |
05 |
Runnable updateui= null ; |
06 |
String[] tmp= null ; |
07 |
String s= "" ; |
08 |
TextView tv= null ; |
09 |
class ReadListener extends Thread{ //监听线程,当数据更新数目大于10条时,更新UI |
10 |
11 |
public void run() |
12 |
{ |
13 |
int i= 0 ,newi= 0 ; |
14 |
while (!fr.readend) |
15 |
{ |
16 |
newi=fr.al.size(); |
17 |
if ((newi-i)> 10 ) //新增数据大于10条,更新UI |
18 |
{ |
19 |
i=newi; |
20 |
tmp=(String[])fr.al.toArray( new String[fr.al.size()]); |
21 |
mHandler.post(updateui); |
22 |
try { |
23 |
Thread.sleep( 100 ); |
24 |
} catch (InterruptedException e) { |
25 |
// TODO Auto-generated catch block |
26 |
e.printStackTrace(); |
27 |
} |
28 |
} |
29 |
} |
30 |
//数据读完了 |
31 |
tmp=(String[])fr.al.toArray( new String[fr.al.size()]); |
32 |
mHandler.post(updateui); |
33 |
try { |
34 |
Thread.sleep( 100 ); |
35 |
} catch (InterruptedException e) { |
36 |
// TODO Auto-generated catch block |
37 |
e.printStackTrace(); |
38 |
} |
39 |
} |
40 |
}; |
41 |
@Override |
42 |
public void onCreate(Bundle savedInstanceState) { |
43 |
super .onCreate(savedInstanceState); |
44 |
setContentView(R.layout.main); |
45 |
tv=(TextView)findViewById(R.id.tv); |
46 |
fr= new FileRead(); |
47 |
ReadNodesThread readThread=fr. new ReadNodesThread(); |
48 |
updateui= new Runnable() //更新UI的线程 |
49 |
{ |
50 |
@Override |
51 |
public void run() { |
52 |
// TODO Auto-generated method stub |
53 |
54 |
int i= 0 ; |
55 |
56 |
for (i=curi;i<tmp.length;i++) |
57 |
{ |
58 |
s+=tmp[i]+ "n" ; |
59 |
} |
60 |
tv.setText(s); |
61 |
curi=i; |
62 |
}}; |
63 |
readThread.start(); |
64 |
ReadListener updateThread= new ReadListener(); |
65 |
mHandler= new Handler(); |
66 |
updateThread.start(); |
67 |
} |
68 |
} |