`
云上太阳
  • 浏览: 131336 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Android线程大坑

阅读更多

     android界面的更新实在主线程进行的,通常把主线程也叫UI线程,UI线程里进行事件的分发和交互。在UI线程中进行耗时操作,比如网络请求,IO操作等会阻塞UI线程,界面会卡住,并且超过大概5秒钟程序会ANR(Application Not Responding),也就是死掉。其实这种GUI单线程的思想在我上一篇博客(http://zyqwst.iteye.com/blog/2262011)都有阐述,道理一模一样,只是android实现的方式上略有不同,所以我建议把上一篇Swing线程的博客能够阅读一遍,Android线程的问题豁然开朗,始终晋级GUI开发的原则:在UI线程中进行界面的更新操作,在单独线程中进行耗时操作

   同样我们从代码看看如何分离UI更新和耗时操作:点击按钮,10秒钟后按钮显示“点击了”。

public void clickBtn(View v){
		Button btn = (Button) findViewById(R.id.btn);
		try {
			Thread.sleep(10000);//模拟耗时操作
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		btn.setText("点击了");
	}

 运行程序,点击按钮,然后界面卡死,然后10秒后才显示出来,或者直接ANR了。很明显上面的代码违背了GUI单线程的原则,耗时操作应该在单独的线程中进行。

 

 

    既然如此那我们再改良下代码,把操作放到单独线程去

public void clickBtn(View v){
		final Button btn = (Button) findViewById(R.id.btn);
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					Thread.sleep(10000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				btn.setText("点击了");
			}
		}).start();
		
	}

 运行代码,点击按钮,界面没有卡住,还可以操作,然后10秒后按钮上的字改变了,或者你根本看不到直接ANR了。已经放到单独线程了,为啥还有错?因为 btn.setText("点击了");这句代码是更新界面的操作,但是它没有在UI线程中执行,而是在其他线程执行了,还是违背了GUI单线程的原则。

 

 

      然后现在有的童鞋会这样修改代码

public void clickBtn(View v){
		final Button btn = (Button) findViewById(R.id.btn);
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					Thread.sleep(10000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
		btn.setText("点击了");
	}

 把更新界面的操作放在单独线程外,运行代码,点击按钮,立即更新按钮文字。这不是我们的业务了。原因很简单,不再赘述。

       既然都不对,那到底应该怎样修改呢?Android给我们提供了几种方法在耗时线程中更新UI界面。

public void clickBtn(View v){
		final Button btn = (Button) findViewById(R.id.btn);
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					Thread.sleep(10000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				btn.post(new Runnable() {
					public void run() {
						btn.setText("点击了");
					}
				});
			}
		}).start();
		
	}

再次修改代码后运行,符合我们的期望,完美。但是代码却变得很复杂,维护性也变差了。所以,也有了很多其他方式,利用Handler、AsyncTask等,还有第三方的框架等。Handle用法,AsyncTask用法可自行百度

 

分享到:
评论

相关推荐

    Android线程结束——合理的结束你想结束的线程

    在Android开发中,线程管理是一项重要的任务,尤其是在处理耗时操作时,如网络请求、数据库操作或大计算量的任务。本篇文章将深入探讨如何合理地结束Android中的线程,以确保应用程序的性能和稳定性。 首先,理解...

    浅谈android线程模型

    ### 浅谈Android线程模型:深入理解与实践 #### 引言 随着智能手机的普及和技术的不断进步,Google的Android操作系统成为了移动设备领域的重要力量。Android不仅为用户提供了丰富的功能,也为开发者提供了广阔的...

    Android线程间通信的Message机制

    Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制

    android 线程之间通过Handler发送消息

    在Android系统中,多线程是提升应用性能和用户体验的重要手段。然而,由于Android UI操作必须在主线程中执行,因此我们需要一种机制来在不同线程间传递消息,这就是Handler的作用。本文将深入探讨Android中如何通过...

    android 线程暂停/恢复/退出demo

    在Android开发中,多线程是必不可少的一部分,特别是在处理耗时任务时,如网络请求、数据库操作或大计算量的任务。本示例“android 线程暂停/恢复/退出demo”将帮助开发者理解如何在Android环境中有效地控制线程的...

    Android开发中的多线程编程技术

    在Android应用开发中,多线程技术是必不可少的,它能帮助开发者实现高效的代码执行,提升用户体验,并确保应用程序的响应性。本资源包主要聚焦于Android平台上的多线程编程,包括理论概念、最佳实践以及实际应用案例...

    从现实生活中理解android 线程消息机制

    在Android系统中,线程消息机制是一个核心概念,它确保了应用程序的高效运行和用户体验的流畅性。这个机制主要由三部分组成:Handler、Looper和Message Queue。下面我们将从现实生活中的例子来深入理解这个机制,并...

    android 线程间通讯

    在Android系统中,线程间通信(Inter-Thread Communication,简称ITC)是应用程序开发中的重要环节,尤其在处理耗时操作或者优化UI性能时显得至关重要。线程间通信允许不同线程之间交换数据和执行任务,以确保主线程...

    Delphi XE5例子中的一个Android线程使用的代码AnonymousThread.rar

    在Delphi XE5开发环境中,Android应用程序的多线程编程是提高应用性能和响应性的重要手段。这个名为"AnonymousThread"的示例项目旨在教你如何在Android平台上创建和管理线程,特别是在Delphi XE5环境下。让我们深入...

    Android多线程文件上传

    在Android应用开发中,文件上传是一项常见的任务,尤其是在处理大文件或者需要提高用户交互体验时,多线程技术显得尤为重要。本主题聚焦于"Android多线程文件上传",我们将探讨如何利用多线程技术来优化文件上传过程...

    Android 中三种启用线程的方法总结

    首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。 而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。 ...

    Android 线程+View的使用

    在Android开发中,线程和View的交互是十分常见的需求,因为Android的UI操作必须在主线程中进行,而耗时的操作(如网络请求、大数据处理等)则应该放在子线程中。本实例主要探讨如何在子线程中更新View,通过两种方式...

    android多线程管理

    在Android开发中,多线程管理是至关重要的技术,它涉及到应用的性能、用户体验以及资源的有效利用。Android系统默认在主线程(UI线程)执行所有的用户交互,如果在这个线程中执行耗时操作,会导致应用程序无响应...

    Android多线程分段下载源码

    在Android开发中,多线程分段下载是一项重要的技术,特别是在处理大文件或者网络环境不稳定的情况下,能够提高下载效率并优化用户体验。这个"Android多线程分段下载源码"实例是一个很好的学习资源,它实现了文件的...

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

    在Android开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用程序的高效运行,尤其是在处理耗时操作如网络请求、数据加载等场景。本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很...

    android 线程详解 各种经典 完整代码

    在Android开发中,线程管理是一项至关重要的技能,因为它直接影响到应用的性能和用户体验。本文将深入探讨Android线程的概念、类型以及如何有效地利用线程进行编程,包括各种经典用法,并提供完整的代码示例。 一、...

    Android----线程实现图片移动

    线程在Android中扮演着处理后台任务的重要角色,它可以避免因为长时间运行操作而阻塞主线程,确保UI的流畅性。 首先,我们需要理解Android的线程模型。主线程,也被称为UI线程,负责处理所有的用户交互,如触摸事件...

    android线程启动方法源代码

    在Android开发中,线程是实现多任务并行执行的关键工具。本文将深入解析Android线程启动的方法,并通过源代码示例帮助初学者理解和掌握这一关键技能。 Android系统基于Java,因此其线程机制遵循Java的基本规则,但...

    Android 线程 多线程 Multi-thread

    ### Android中的线程与多线程技术详解 在Android开发中,线程和多线程技术是实现应用程序高效运行的关键所在。本篇文章将详细介绍Android线程的基础知识、使用方法及同步机制等内容。 #### 一、Android线程概述 ...

    android 线程通信学习

    在Android应用开发中,线程通信是至关重要的一个环节,它涉及到UI线程与工作线程之间的数据交换和控制流程。本教程将深入探讨Android线程通信的基本概念、常用方法以及如何通过Demo来实践这些技术。 一、Android...

Global site tag (gtag.js) - Google Analytics