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 |
} |





