`
gryphone
  • 浏览: 434979 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Thread&Handle 使用

阅读更多

Thread&Handle

 

本次以进度提示为例 讲解Thread&Handle的使用

 

[前提]

1. Thread 
* 启动:start()
* 停止:stop()
* 定制化: 填充 void run()


2. Handler
* 使用: sendMessage() / sendEmptyMessage()
* 接受&处理:定制化 void handleMessage(Message message)

 

 

典型用法:

public class ThreadUsage extends Activity {
	public final static int MESSAGE_SAMPLE = 19;
	TextView text;
	ProgressBar pBar;
	
	Handler sHandler;
	Thread sThread;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        text = (TextView)findViewById(R.id.text);
        
        sThread = new Thread(){
        	public void run(){
        		while(true){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
					Message m = new Message();
					m.what = MESSAGE_SAMPLE;
					
					sHandler.sendMessage(m);
				}
        	}
        };
        
        sThread.start();
        
        sHandler = new Handler(){
        	public void handleMessage(Message msg) {
        		int i = msg.what;
        		
        		if(i == MESSAGE_SAMPLE){
        			String s = text.getText().toString();
    				
    				text.setText(s+".");
        		}
        		else {
        			//un-support message type
        		}
            }
        };
        
    }
}

 

 

 

[代码 步骤]

1. 定义 running.xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/text"
    android:paddingLeft="10dip"
    android:text="is running"
    />
<TextView  
    android:layout_width="100dip" 
    android:layout_height="wrap_content" 
    android:id="@+id/progress"
    android:text="................."
    />
<Button  
    android:layout_width="100dip" 
    android:layout_height="wrap_content" 
    android:id="@+id/buttonOK"
    android:text="OK!"
    />
</LinearLayout>

 

 

 2. 定义 RunningDialog 构造函数 并根据参数 创建目标AlertDialog

public RunningDialog(Activity a,String title,Drawable d){
		activity = a;
		
		initialView(activity);
		
		aBuilder = new AlertDialog.Builder(activity);
		aBuilder.setTitle(title).setIcon(d).setView(runningView);
		
		aDialog = aBuilder.create();
		
		installUpdate();
	}

 

private void initialView(Activity a){
		runningView = a.getLayoutInflater().inflate(R.layout.running, null);
		
		progress = (TextView)runningView.findViewById(R.id.progress);
		btnOK = (Button)runningView.findViewById(R.id.buttonOK);
		
		btnOK.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				end();
			}
        	
        });
	}

 

 

3. 定义Thread&Handle 定时刷新TextView显示

private void installUpdate(){
		updateHandler = new Handler(){
			public void handleMessage(Message msg) {
        		int i = msg.what;
        		
        		if(i == MESSAGE_TOGO){
        			updateProgress();
        		}
        		else {
        			//un-support message
        		}
            }
		};
		
		updateThread = new Thread(){
			public void run(){
        		while(true){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					Message m = new Message();
					m.what = MESSAGE_TOGO;
					
					updateHandler.sendMessage(m);
				}
        	}
		};
		
	}
	
	private void updateProgress(){
		count++;
		
		String string = progress.getText().toString();
		
    	if(count >= 10){
    		progress.setText(".");
    		count = 0;
    	}
    	else {
    		progress.setText(string+".");
    	}
		
    	progress.setTextSize(20);
	}

 

 

4. 定义2个函数 分别用于显示/取消该AlertDialog

public void start(){
		if(isResume){
			updateThread.resume();
		}
		else {
			updateThread.start();
			isResume = true;
		}
		aDialog.show();
	}
	
	public void end(){
		updateThread.stop();
		aDialog.dismiss();
		
		updateThread.resume();
	}

 

 

5. 如何使用:

public class RunningDialogTest extends Activity {
	RunningDialog rDialog;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Drawable d = this.getResources().getDrawable(R.drawable.icon);
        rDialog = new RunningDialog(this,"HelloRunning!",d);
        findViewById(R.id.button).setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				rDialog.start();
			}
        	
        });
    }
    
}

 

 

6. emulator 运行截图:

 

 

done! ~~~

 

分享到:
评论

相关推荐

    Thread和Handle的使用

    理解并熟练掌握Thread和Handler的使用对于开发高性能、流畅的Android应用至关重要。正确地在后台线程执行耗时任务并利用Handler返回结果到主线程,可以避免UI冻结,提高用户体验。在实际项目中,还可以结合使用`...

    Android-Handle-Thread.rar_android_handle thread

    综上所述,“Android-Handle-Thread.rar”中的内容将帮助开发者深入理解Android中线程和Handler的使用,提升应用的并发处理能力,优化用户界面的响应性能。通过学习和实践,开发者能够更自如地应对复杂的多线程场景...

    安卓学习之handle的使用方法

    要创建一个新的线程,需要通过 `Thread.start()` 或使用 `ExecutorService` 等方法。Handle 的目的是协调不同线程之间的通信,而不是直接创建新线程。 接下来,我们来看消息队列(Message)。Message 是 Android 中...

    android demo,实现主线程handle,工作子线程threadHandle的处理

    - 在子线程中,使用`threadHandler`发送一个Message,指定目标为`mainHandler`。 - Message中可以携带数据,例如通过`Message.obj`或`Message.what`设置。 - `mainHandler`在主线程接收到Message后,执行回调方法...

    RT-Thread常见函数.zip_RTT_rt thread_rt-thread函数_rt_thread函数_手册

    5. **中断处理**:RTT支持中断服务,`rt_interrupt_enter`和`rt_interrupt_leave`用于中断上下文的切换,`rt_hw_interrupt_handle`处理中断事件。 6. **设备驱动**:RTT提供了统一的设备驱动接口,如I/O操作,`rt_...

    简单的handle demo 实现计时器功能,亲测可用,线程例子

    本示例将探讨如何使用Handle机制来实现一个简单的计时器功能。Handle,通常指的是Android中的Handler类,它与Looper和Message配合,用于在Android主线程中进行消息处理和更新UI。以下是对这个"简单的handle demo ...

    Android_Handle_Thread

    而传统的 Thread 类则可以自定义线程逻辑,但需要注意的是,直接在 Thread 中更新 UI 会导致 CalledFromWrongThreadException 异常,所以通常需要配合 Handler 使用。 总的来说,Android 多线程管理的核心在于合理...

    Android Handle Thread.docx

    在Android系统中,线程管理是非常关键的一部分,尤其是在创建高性能和响应迅速的应用程序时。本文主要探讨了Android的进程和线程模型,以及如何在多线程环境下有效地更新UI。 首先,我们来看Android的进程机制。...

    android demo,主线程handle

    工作线程(Worker Thread)是为了执行耗时操作而创建的,例如网络请求、数据库操作等,这样可以避免阻塞主线程。在工作线程中,我们同样可以创建一个`Handler`实例,但这个`Handler`与主线程的`Handler`不同,它用于...

    java 手写实现 Android Handle 机制

    本篇文章将详细讲解如何使用Java手写实现Android的Handler机制,以及背后的原理。 首先,我们需要理解Android的主线程,也被称为UI线程,它是负责处理用户交互和更新界面的线程。当需要在后台执行耗时任务时,我们...

    C++基础辅助类库,比如异步进行-Thread,安全句柄-CHandle,资源守卫-Guard,XML解析-rapidxml,以

    标题和描述中提到了几个关键的C++辅助类库,包括用于异步处理的`Thread`,确保对象安全释放的`CHandle`,资源管理的`Guard`,以及XML解析的`rapidxml`。下面将对这些知识点进行详细解释。 1. **异步进行-Thread**:...

    C++基础辅助类库,含Thread,CHandle,Guard,rapidxml

    C++基础辅助类库,比如异步进行-Thread,安全句柄-CHandle,资源守卫-Guard,XML解析-rapidxml,以及其他注册表、文件基础操作。用于更加高效、安全的进行C++开发。温馨提示:至少需要支持C++0x标准的编译器。

    android handle线程数据传递 源代码

    本文将深入探讨Android多线程中的数据传递以及如何通过Handle实现UI更新。 首先,我们了解下Android线程的基本概念。Android应用主要运行在主线程,也称为UI线程,负责处理用户交互和更新UI。由于主线程不允许执行...

    VC6.0 下Thread学习

    五、使用Thread.exe和Thread 提供的"Thread.exe"可能是用于演示线程操作的示例程序。它可能包含了创建、运行、暂停、恢复和中断线程的代码实例。通过反编译或查看源代码(如果提供),可以更好地理解线程管理的实际...

    TimerCount:计时器,Thread + Handle更新UI

    综上所述,"TimerCount:计时器,Thread + Handle更新UI" 的核心内容涉及了Java中的计时器使用、多线程编程、UI更新的线程安全策略以及可能的项目组织结构。通过分析`TimerCount-master` 文件夹中的代码,我们可以...

    rtthread_stm32f103zet6消息队列工程.rar

    本文将深入探讨如何在RTThread上为STM32F103ZET6实现消息队列功能,并基于“实验0-1 Template工程模板-新建工程章节使用”进行解析。 首先,理解消息队列的概念至关重要。消息队列是一种进程间通信(IPC)机制,...

    android中Handle类的用法实例分析

    在Android开发中,Handle类是实现线程间通信和异步处理的核心工具。它与Looper、Message紧密配合,使得在...在实际项目中,Handle常与其他组件(如AsyncTask、BroadcastReceiver等)结合使用,以实现更复杂的业务逻辑。

    C++基础辅助类库,异步进行-Thread,安全句柄-CHandle,资源守卫-Guard,XML解析-rapidxml

    C++基础辅助类库,比如异步进行-Thread,安全句柄-CHandle,资源守卫-Guard,XML解析-rapidxml,以及其他注册表、文件基础操作。用于更加高效、安全的进行C++开发。温馨提示:至少需要支持C++0x标准的编译器。 C++...

    详解C++ thread用法总结

    通过使用std::thread类,程序员可以创建新的线程来执行特定的任务,从而实现程序的多线程并行处理。 首先,std::thread类的成员函数提供了丰富的接口来控制线程的行为。例如,get_id成员函数可以获取线程的ID,它...

Global site tag (gtag.js) - Google Analytics