Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx

上传人:b****6 文档编号:20624948 上传时间:2023-01-24 格式:DOCX 页数:11 大小:23.95KB
下载 相关 举报
Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx_第1页
第1页 / 共11页
Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx_第2页
第2页 / 共11页
Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx_第3页
第3页 / 共11页
Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx_第4页
第4页 / 共11页
Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx

《Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。

Android的线程使用来更新UIThreadHandlerLooperWord文档下载推荐.docx

在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类,TimerTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的AlarmManager使用Timer定时器是一种更好的解决方法。

我们需要引入importjava.util.Timer;

和importjava.util.TimerTask;

publicclassJavaTimerextendsActivity{

Timertimer=newTimer();

TimerTasktask=newTimerTask(){

setTitle("

hearme?

"

);

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

timer.schedule(task,10000);

}

方法四:

(TimerTask+Handler)

实际上这样做是不行的,这跟Android的线程安全有关!

应该通过配合Handler来实现timer功能的!

publicclassTestTimerextendsActivity{

Handlerhandler=newHandler(){

case1:

 

TimerTasktask=newTimerTask(){

Messagemessage=newMessage();

message.what=1;

handler.sendMessage(message);

方法五:

(Runnable+Handler.postDelayed(runnable,time) 

在Android里定时更新UI,通常使用的是 

java.util.Timer, 

java.util.TimerTask,android.os.Handler组合。

实际上Handler自身已经提供了定时的功能。

 

privateHandlerhandler=newHandler();

privateRunnablemyRunnable=newRunnable(){

if(run){

handler.postDelayed(this,1000);

count++;

tvCounter.setText("

Count:

"

+count);

Java平台从开始就被设计成为多线程环境。

在你的主程序执行的时候,其它作业如碎片收集和事件处理则是在后台进行的。

本质上,你可以认为这些作业是线程。

它们正好是系统管理线程,但是无论如何,它们是线程。

线程使你能够定义相互独立的作业,彼此之间互不干扰。

系统将交换这些作业进或出CPU,这样(从外部看来)它们好象是同时运行的。

  在你需要在你的程序中处理多个作业时,你也可以使用多个进程。

这些进程可以是你自己创建的,你也可以操纵系统线程。

  你进行这些多作业处理,要使用几个不同的类或接口:

   java.util.Timer类

   javax.swing.Timer类

   Thread类

   Runnable接口

  对于简单的作业,通常需要重复的,你可以使用java.util.Timer类告诉它“每半秒钟做一次”。

注意:

大多数系统例程是使用毫秒的。

半秒钟是500毫秒。

  你希望Timer实现的任务是在java.util.TimerTask实例中定义的,其中运行的方法包含要执行的任务。

这些在Hi类中进行了演示,其中字符串“Hi”重复地被显示在屏幕上,直到你按Enter键。

importjava.util.*;

publicclassHi{

 publicstaticvoidmain(Stringargs[])

 throwsjava.io.IOException{

  TimerTasktask=newTimerTask(){

  publicvoidrun(){

   System.out.println("

Hi"

  }

 };

 Timertimer=newTimer();

 timer.schedule(task,0,500);

 System.out.println("

PressENTERtostop"

 System.in.read(newbyte[10]);

 timer.cancel();

}

  JavaRuntimeEnvironment工作的方式是只要有一个线程在运行,程序就不退出。

这样,当取消被调用,没有其它线程在运行了,则程序退出。

有一些系统线程在运行,如碎片收集程序。

这些系统线程也被称为后台线程。

后台线程的存在不影响运行环境被关闭,只有非后台线程保证运行环境不被关闭。

  Javax.swing.Timer类与java.util.timer类的工作方式相似,但是有一些差别需要注意。

第一,运行的作业被ActionListener接口的实现来定义。

第二,作业的执行是在事件处理线程内部进行的,而不象java.util.Timer类是在它的外部。

这是很重要的,因为它关系到Swing组件集是如何设计的。

  如果你不熟悉Swing,它是一组可以被Java程序使用的图形组件。

Swing被设计程被称为单线程的。

这意味着对Swing类内部内容的访问必须在单个线程中完成。

这个特定的线程是事件处理线程。

这样,例如你想改变Label组件的文字,你不能仅仅调用Jlabel的setText方法。

相反,你必须确认setText调用发生在事件处理线程中,而这正是javax.swing.Time类派的上用场的地方。

  为了说明这第二种情况,下面的程序显示一个增加的计数器的值。

美半秒钟计数器的数值增加,并且新的数值被显示。

importjavax.swing.*;

importjava.awt.*;

importjava.awt.event.*;

publicclassCount{

 publicstaticvoidmain(Stringargs[]){

  JFrameframe=newJFrame();

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  ContainercontentPane=frame.getContentPane();

  finalJLabellabel=newJLabel("

JLabel.CENTER);

  label.setFont(newFont("

Serif"

Font.PLAIN,36));

  contentPane.add(label,BorderLayout.CENTER);

  ActionListenerlistener=newActionListener(){

   intcount=0;

   publicvoidactionPerformed(ActionEvente){

    count++;

    label.setText(Integer.toString(count));

   }

  };

  Timertimer=newTimer(500,listener);

  timer.start();

  frame.setSize(300,100);

  frame.show();

 }

  上述程序的结果是:

  万一你要做的不是一个简单的重复作业,java.lang.Thread类就派上了用场。

它允许你自己控制基本功能。

通过创建Thread的一个子类,你可以使你的系统脱离,并进行一个长时间运行的作业,如从网络上读取一个文件,而不阻碍你的其它程序的运行。

这种长时间运行的作业将在run方法中定义。

第二种方式是创建Thread类的子类并在子类中实现run方法,或在实现runnable的类中实现run方法,并将这个实现传递给Thread的构造函数。

  你可能会问有什么区别。

Java编程语言仅支持单一继承。

如果你设计的调用是除了Thread以外的其它类,你可以是你的类实现Runnable,而它可以是你的作业被执行。

否则,你定义Thread的子类来运行你的Run方法,在处理过程中不再添加其它操作。

  对于创建Thread子类的第三种情况,下面的程序生成了一个新的线程来计算一个特定URL的字符数,这个URL是通过命令行传递进来的。

在这进行过程之中,实现Runnable的第四种情况被演示,打印出重复的消息。

注意在实现Runnable的这后一种情况下,你必须提供重复消息的代码。

你必须同时sleep,以分配时间并完成操作。

在两种情况下,与使用Timer相比较。

这段程序的最后一部分包含有你从命令行读取命令以触发程序结束。

注意在系统读取URL并打印消息的同时,你总可以按Enter键结束程序。

importjava.io.*;

import.*;

publicclassBoth{

  finalStringurlString=args[0];

  finalStringmessage=args[1];

  Threadthread1=newThread(){

   publicvoidrun(){

    try{

     URLurl=newURL(urlString);

     URLConnectionconnection=url.openConnection();

     InputStreamReaderisr=newInputStreamReader(

      connection.getInputStream());

     BufferedReaderreader=newBufferedReader(isr);

     intcount=0;

     while(reader.read()!

=-1){

       count++;

     }

     System.out.println("

Sizeis:

     reader.close();

    }catch(MalformedURLExceptione){

     System.err.println("

BadURL:

+urlString);

    }catch(IOExceptione){

I/OProblems"

    }

  thread1.start();

  Runnablerunnable=newRunnable(){

    while(true){

     System.out.println(message);

     try{

      Thread.sleep(500);

     }catch(InterruptedExceptione){

  Threadthread2=newThread(runnable);

  thread2.start();

  try{

   System.in.read(newbyte[10]);

  }catch(IOExceptione){

  System.out.println("

I/Oproblems"

 System.exit(0);

  为有多种方式来处理线程,你选用哪种技术取决于你和你面临的条件。

要成为一个有效的Java编程人员,尽管你通常不必学习Java编程语言的所有内容和核心库,但是线程是一个例外。

你越早了解线程如何工作和如何使用线程,你将越早了解Java程序如何工作和交互。

案例:

Xml代码

<

?

xml 

version="

1.0"

encoding="

utf-8"

>

LinearLayout 

xmlns:

android="

android:

orientation="

vertical"

android:

layout_width="

fill_parent"

layout_height="

TextView 

id="

@+id/counter"

wrap_content"

text="

0"

/>

horizontal"

Button 

start"

@+id/Button01"

layout_weight="

/Button>

stop"

@+id/Button02"

enabled="

false"

reset"

@+id/Button03"

/LinearLayout>

package 

cn.yo2.aquarium.android.testtimer;

1. 

2.import 

android.app.Activity;

3.import 

android.os.Bundle;

4.import 

android.os.Handler;

5.import 

android.view.View;

6.import 

android.view.View.OnClickListener;

7.import 

android.widget.Button;

8.import 

android.widget.TextView;

9. 

10.public 

class 

TestTimer 

extends 

Activity 

11. 

private 

btnStart;

12. 

btnStop;

13. 

btnReset;

14. 

tvCounter;

15. 

long 

count 

0;

16. 

boolean 

run 

false;

17. 

18. 

Handler 

handler 

new 

Handler();

19. 

20. 

Runnable 

task 

Runnable() 

21. 

22. 

public 

void 

run() 

23. 

// 

TODO 

Auto-generated 

method 

stub 

24. 

if 

(run) 

25. 

handler.postDelayed(this, 

1000);

26. 

count++;

27. 

28. 

tvCounter.setText("

count);

29. 

30. 

};

31. 

32. 

/** 

Called 

when 

the 

activity 

is 

first 

created. 

*/ 

33. 

@Override 

34. 

onCreate(Bundle 

savedInstanceState) 

35. 

super.onCreate(savedInstanceState);

36. 

setContentView(R.layout.main);

37. 

38. 

btnStart 

(Button) 

findViewById(R.id.Button01);

39. 

btnStop 

findViewById(R.id.Button02);

40. 

btnReset 

findViewById(R.id.Button03);

41. 

tvCounter 

(TextView) 

findViewById(R.id.counter);

42. 

43. 

btnStart.setOnClickListener(new 

OnClickListener() 

44. 

45. 

onClick(View 

v) 

46. 

47. 

true;

48. 

updateButton();

49. 

handler.postDelayed(task, 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1