黑马程序员技术交流社区

标题: Android技术分享,如何使用多线程和Handler同步更新UI [打印本页]

作者: 张然龙    时间: 2014-7-30 11:34
标题: Android技术分享,如何使用多线程和Handler同步更新UI


如果运行时,可以看到滚动条由条慢慢变短,则说明程序成功了。截图如下,建议选择大点的文件做测试。


1. [图片] 1.jpg   

2. [图片] 2.jpg   


3. [代码]main.xml布局文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <ScrollView
  3. xmlns:Android="http://schemas.android.com/apk/res/android"
  4. Android:layout_height="wrap_content" android:id="@+id/scrollView1" android:layout_width="fill_parent">
  5.     <LinearLayout Android:id="@+id/linearLayout1"
  6.     Android:orientation="vertical"   
  7.     Android:layout_width="fill_parent"
  8.     Android:layout_height="wrap_content">
  9. <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
  1. public class FileRead {
  2. boolean readend=false;
  3. List<String> al=null;
  4. public  class ReadNodesThread extends Thread{//读取线程

  5. public void run()
  6. {
  7. al=new ArrayList<String>(100);
  8. al.clear();
  9. readend=false;
  10. int i=0;
  11. try {
  12. RandomAccessFile raf=new RandomAccessFile("/sdcard/test.txt","r");
  13. //try {
  14. while(raf.getFilePointer()<raf.length())
  15. {
  16. al.add(raf.readLine());
  17. //sleep(100);//如果测试文件太小,这里休眠是为了测试,
  18. }

  19. } catch (Exception e1) {
  20. // TODO Auto-generated catch block
  21. e1.printStackTrace();
  22. }
  23. readend=true;
  24. }
  25. };
  26. }
复制代码

5. [代码]MultiThreadActivity.java

  1. public class MultiThreadActivity extends Activity {
  2. FileRead fr=null;
  3. Handler mHandler=null;
  4. int curi=0;
  5. Runnable updateui=null;
  6. String[] tmp=null;
  7. String s="";
  8. TextView tv=null;
  9. class ReadListener extends Thread{//监听线程,当数据更新数目大于10条时,更新UI

  10. public void run()
  11. {
  12. int i=0,newi=0;
  13. while(!fr.readend)
  14. {
  15. newi=fr.al.size();
  16. if((newi-i)>10)//新增数据大于10条,更新UI
  17. {
  18. i=newi;
  19. tmp=(String[])fr.al.toArray(new String[fr.al.size()]);
  20. mHandler.post(updateui);
  21. try {
  22. Thread.sleep(100);
  23. } catch (InterruptedException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. //数据读完了
  30. tmp=(String[])fr.al.toArray(new String[fr.al.size()]);
  31. mHandler.post(updateui);
  32. try {
  33. Thread.sleep(100);
  34. } catch (InterruptedException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. }
  39. };
  40. @Override
  41. public void onCreate(Bundle savedInstanceState) {
  42. super.onCreate(savedInstanceState);
  43. setContentView(R.layout.main);
  44. tv=(TextView)findViewById(R.id.tv);
  45. fr=new FileRead();
  46. ReadNodesThread readThread=fr.new ReadNodesThread();
  47. updateui=new Runnable()//更新UI的线程
  48. {
  49. @Override
  50. public void run() {
  51. // TODO Auto-generated method stub

  52. int i=0;

  53. for(i=curi;i<tmp.length;i++)
  54. {
  55. s+=tmp[i]+"\n";
  56. }
  57. tv.setText(s);
  58. curi=i;
  59. }};
  60. readThread.start();
  61. ReadListener updateThread=new ReadListener();
  62. mHandler=new Handler();
  63. updateThread.start();
  64. }
  65. }
复制代码








作者: 高老强    时间: 2014-7-30 19:06
你继续发,我继续评论, 么么哒




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2