`

线程处理UI的理解Demo

阅读更多
这个例子对于子线程不能处理UI线程的View可以有助于了解:
package com.example;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

/*介紹過Android主線程與子線程之溝通。所謂主線程通常是UI線程。
 * Android的UI是單線程(Single-threaded)的。為了避免拖住GUI,
 * 一些較費時的物件應該交給獨立的線程去執行。如果幕後的線程來執行UI物件,
 * Android就會發出錯誤訊息CalledFromWrongThreadException 
 * 基本上,Android希望UI thread能夠給予User做快速的反應。
 * 如果UI thread花費太多時間做幕後的事情,超過5秒鐘,Android就會給user提示
 */

public class Looper_6 extends Activity implements OnClickListener {
	private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
	private final int FP = LinearLayout.LayoutParams.FILL_PARENT;
	public TextView tv;
	private myThread t;
	private Button btn, btn2;
	private Handler h;
	private Context ctx;

	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		ctx = this;
		LinearLayout layout = new LinearLayout(this);
		layout.setOrientation(LinearLayout.VERTICAL);

		btn = new Button(this);
		btn.setId(101);
		btn.setBackgroundResource(R.drawable.icon);
		btn.setText("test looper");
		btn.setOnClickListener(this);
		LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(100, 50);
		param.topMargin = 10;
		layout.addView(btn, param);

		btn2 = new Button(this);
		btn2.setId(102);
		btn2.setBackgroundResource(R.drawable.icon);
		btn2.setText("exit");
		btn2.setOnClickListener(this);
		layout.addView(btn2, param);

		tv = new TextView(this);
		tv.setTextColor(Color.WHITE);
		tv.setText("");
		LinearLayout.LayoutParams param2 = new LinearLayout.LayoutParams(FP, WC);
		param2.topMargin = 10;
		layout.addView(tv, param2);
		setContentView(layout);
		// ------------------------
		t = new myThread();
		t.start();
	}

	public void onClick(View v) {
		switch (v.getId()) {
		case 101:
			try {
				Thread.sleep(8000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			String obj = "mainThread";
			Message m = h.obtainMessage(1, 1, 1, obj);
			h.sendMessage(m);
			break;
		case 102:
			h.getLooper().quit();
			finish();
			break;
		}
	}

	public class EventHandler extends Handler {
		public EventHandler(Looper looper) {
			super(looper);
		}

		@Override
		public void handleMessage(Message msg) {
			tv.setText((String) msg.obj);
		}
	}

	class myThread extends Thread {
		final boolean TEST_FLAG = false;

		public void run() {
			Looper.prepare();
			h = new Handler() {
				public void handleMessage(Message msg) {
					if (TEST_FLAG)
						// tv物件是主線程誕生的UI物件
						// 如果子線程也去插手的話,Android程式就停止了
						tv.setText("myThread is running");
					else {
						EventHandler ha = new EventHandler(Looper
								.getMainLooper());
						String obj = (String) msg.obj + ", myThread";
						Message m = ha.obtainMessage(1, 1, 1, obj);
						ha.sendMessage(m);
					}
				}
			};
			Looper.loop();
		}
	}
}

分享到:
评论
1 楼 edison_cool911 2010-08-01  
8.1--100

相关推荐

    C#-WinForm跨线程修改UI界面的实例

    通过学习这个实例,开发者可以掌握如何在多线程环境中正确处理UI更新,避免出现线程安全问题,提高应用程序的响应性和用户体验。 总结来说,C# WinForm应用中的跨线程修改UI是通过异步编程和UI线程同步机制来实现的...

    Android Thread线程动态操作UI的Demo

    标题"Android Thread线程动态操作UI的Demo"所涉及的核心知识点包括: 1. 主线程与工作线程: Android应用的UI更新必须在主线程进行,而耗时操作如网络请求、数据库操作等应放在工作线程(Worker Thread)。主线程...

    WPFC#.net 跨线程更新UI 线程测试 解决界面卡死

    Demo测试跨线更新UI 第一种 : Thread 达到跨线程更新UI 虽然使用Dispatcher.Invoke 和模拟winform 里面的DoEvent 但是运行中关闭还是会有异常,而且耗资源高; 第二种 : DispatcherTimer 失败:UI还是会卡顿; 第三...

    winfrom的多线程显示进度条的demo源码

    通过学习和实践这个Demo,开发者可以掌握如何在WinForms应用中有效地实现多线程和进度条功能,提高用户体验,并理解如何在多线程环境中安全地更新UI。在实际项目中,这样的技术可以应用于数据加载、文件操作、网络...

    Delphi多线程Demo

    在Demo中,如果线程需要更新UI(用户界面),那么必须在主线程中进行,因为只有主线程才能修改UI组件。我们可以使用Synchronize或Queue方法将更新UI的任务调度到主线程。 至于“每隔一秒刷新一次当前时间”,这可以...

    iOS多线程Demo

    在iOS开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用程序的高效运行和流畅的用户体验。本文将深入探讨“iOS多线程...通过这个Demo,开发者可以更深入地理解多线程编程,提升iOS应用的性能和用户体验。

    uidemo01.zip

    标题“uidemo01.zip”暗示我们关注的是一个包含了用户界面示例的压缩文件,而“漂亮通用界面”的描述进一步提示我们,这个压缩包可能包含了一些设计精良、适用于多种场景的用户界面元素或者应用程序。标签“qt”揭示...

    安卓多线程断点现在的demo

    在安卓应用开发中,多线程技术是...这个“安卓多线程断点现在的demo”是一个全面展示Android下载功能的实例,开发者可以通过学习和理解这个demo,提升自己在处理复杂下载任务时的能力,更好地优化应用性能和用户体验。

    android demo,Runnable异步线程的处理

    首先,我们需要理解Android主线程,也被称为UI线程,它负责处理用户界面的更新和事件响应。如果在主线程中执行长时间运行的任务,会阻塞UI,导致应用无响应(ANR)。因此,Android开发者需要学习如何正确地使用异步...

    android多线程demo(很清晰很详细)

    通过对这个demo的深入学习,学生能更好地理解Android多线程的工作原理和实践技巧。 总结来说,Android多线程的掌握对于开发者优化应用性能和提升用户体验至关重要。通过分析这个详细的demo,学生们可以逐步了解并...

    C#多线程Demo

    本压缩包“C#多线程Demo”提供了四个具体的WinForm多线程示例,旨在帮助开发者深入理解和掌握线程的使用。下面将详细介绍这些知识点。 1. **线程的创建与启动** 在C#中,我们可以通过`System.Threading`命名空间中...

    Android多线程详解与Demo

    首先,我们需要理解Android主线程,也被称为UI线程,它的主要任务是处理用户界面事件,如触摸事件、绘制视图等。如果在这个线程中执行耗时操作,如网络请求或数据库操作,就会导致应用程序无响应(ANR),严重影响...

    android文件多线程下载demo

    总之,“android文件多线程下载demo”涵盖了Android开发中的多线程编程和SQLite数据库应用两大关键知识点,对于初学者来说,这是一个很好的实践项目,可以帮助他们深入理解这两个重要概念,并将其应用于实际项目中。...

    BackgroundWorker Demo

    1. **异步执行任务**:`BackgroundWorker`提供了异步执行任务的能力,这意味着主要的UI线程可以继续处理用户交互,而不会因为等待后台任务完成而冻结。 2. **事件驱动模型**:`BackgroundWorker`使用事件来报告进度...

    c#初学者多线程编程DEMO

    本DEMO针对初学者,旨在帮助理解如何在C#环境中进行多线程编程,并通过简洁的代码示例来突出关键点。 首先,我们需要了解.NET Framework提供的System.Threading命名空间,它是C#多线程编程的核心。在该命名空间中,...

    基于VS2010的C++多线程开发Demo

    通常,主线程(UI线程)负责用户界面的更新,而其他线程则处理计算等任务。当计算完成需要更新界面时,应通过消息队列或事件通知主线程进行操作,以确保界面的稳定和一致性。 总的来说,"基于VS2010的C++多线程开发...

    android 多线程下载demo

    这个"android多线程下载demo"展示了如何利用多线程分段下载一个APK文件,同时实现实时更新UI展示下载进度,并在下载完成后自动跳转到应用安装界面。以下是对这个Demo涉及知识点的详细解释: 1. **多线程下载**:多...

    wpf 子线程更新UI demo

    在WPF(Windows Presentation Foundation)应用中,由于UI线程(主线程)负责处理用户界面的绘制和事件处理,因此当需要在子线程中修改UI元素时,必须遵循特定的规则来确保线程安全。这个"wpf 子线程更新UI demo"是...

    Android 多线程下载简单demo之Thread

    本文将基于提供的标题“Android 多线程下载简单demo之Thread”和描述,深入讲解如何实现一个简单的多线程下载功能。这个示例来源于一个CSDN博客,通过访问提供的链接...

Global site tag (gtag.js) - Google Analytics