android_线

说明:android螺纹。

android无非就是一个线程Main Thread和Worker Thread。(除了主线程Main Thread是Worker Thread)

Main Thread 也叫UI Thread 。绝大部分的UI 代码都执行在主线程的。

Worker Thread 通常完毕耗时较长、会产生堵塞的操作,比如訪问网络、进行大量IO的读写。

接下来用几个样例来说明一下。

样例:

1、用户点击Button,开启新的Worker Thread,在Worker Thread里面改动UI(改动TextView的属性)。

package com.example.b_05_thread01;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView textView;
	private Button button;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.textViewId);
		button = (Button) findViewById(R.id.buttonId);

		button.setOnClickListener(new ButtonListener());
	}

	class ButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			Thread t = new MyThread();
			t.start();
		}
	}

	// Worker Thread
	class MyThread extends Thread {
		@Override
		public void run() {
			for (int i = 0; i <= 100; i++) {
				try {
					Thread.sleep(1 * 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				textView.setText("来自于线程的改动");   // 程序会报错,由于仅仅能在主线程中改动ui。

}
		}
	}
}

执行结果:程序会报错,由于在主线程之外,原则上是不能改动ui的属性。

(也有例外,比如ProgressBar)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWN3b2w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

2、用户点击Button,开启新的Worker Thread。在Worker Thread里面改动UI(改动ProgressBar的属性)。

package com.example.b_05_thread01;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView textView;
	private Button button;
	private ProgressBar proBar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.textViewId);
		button = (Button) findViewById(R.id.buttonId);
		proBar = (ProgressBar) findViewById(R.id.proBarId);
		button.setOnClickListener(new ButtonListener());
	}

	class ButtonListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			Thread t = new MyThread();
			t.start();
		}
	}

	// Worker Thread
	class MyThread extends Thread {
		@Override
		public void run() {
			for (int i = 0; i <= 100; i++) {
				 try {
				 Thread.sleep(100);
				 } catch (InterruptedException e) {
				 e.printStackTrace();
				 }
				 proBar.setProgress(proBar.getProgress() + 1);
			}
		}
	}
}

执行结果:成功。

3、既然在Worker Thread里面不能改动UI,那么就不须要Worker Thread。全部的事情在Main Thread里面操作,行不行呢?  答案是不行的!

当用户点击Button,不开启新的线程,直接在Main Thread里面休眠。

package com.example.b_05_thread01;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView textView;
	private Button button;
	private ProgressBar proBar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.textViewId);
		button = (Button) findViewById(R.id.buttonId);
		proBar = (ProgressBar) findViewById(R.id.proBarId);
		button.setOnClickListener(new ButtonListener());
	}

	// 在一个应用程序其中,主线程通经常使用于接收用户的输入,以及将运算的结果反馈给用户
	// 所以说,对于一些堵塞的操作,必须放置在Worker Thread其中
	class ButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			try {
				Thread.sleep(5 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// Thread t = new MyThread();
			// t.start();
		}
	}

//	// Worker Thread
//	class MyThread extends Thread {
//		@Override
//		public void run() {
//			for (int i = 0; i <= 100; i++) {
//				try {
//					Thread.sleep(100);
//				} catch (InterruptedException e) {
//					e.printStackTrace();
//				}
//				proBar.setProgress(proBar.getProgress() + 1);
//			}
//		}
//	}
}

执行结果:如图。

在一个应用程序其中。主线程通经常使用于接收用户的输入,以及将运算的结果反馈给用户,所以说,对于一些堵塞的操作。必须放置在Worker Thread其中。

欢迎交流 http://blog.csdn.net/ycwol/article/details/39900371

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-23 02:08:49

android_线的相关文章

线扫相机项目中定量判断机构运动是否匀速的方法

线扫相机的原理:线扫相机一般一次只拍摄一条线(线宽通常是1个像素),在机构运动的过程中,线扫相机不断地拍摄线,于是“聚线成面”,这就是线扫相机成像的原理. 线扫相机的原理决定了,它所拍摄的物体必须要运动.机构运动的话,就存在机构的速度是否和线扫相机采集的速度匹配的问题. 将对机构运动速度的要求进行拆分的话,其实就是如下两点: ① 运动速度必须与线扫相机的工作行频(即采集速度)相匹配. ② 机构的运动速度最好是匀速,或者十分接近匀速. 如果机构速度过快,最后的图像在运动方向上被压缩:如果机构速度过

半截水晶头线接激活本地虚拟网卡

可有可无的小方法~ 很多人在用虚拟机的时候,有时虚拟网卡不够用,又没有可用网线插来激活本地网卡时,这时可以自制一个水晶头加半截网线(或者从水晶头还 能用的废掉的网线上截取下来如下图)来激活本地网卡,多增加一个可用虚拟网卡(虽然第一次在当时无法解决(^-^)) 制作方法:截取或制作成水晶头后,将线皮剥掉至漏出铜线,将线序颜色排列成T-568B的线序(如下图) 以10/100兆太网网卡为例的DTE类型接口引脚定义为(对应上图从左到右): 1-TX+Tranceive  Data+  (发信号+)  

ArcGIS API for Silverlight 点沿着线流动

原文:ArcGIS API for Silverlight 点沿着线流动 概述 前段时间做了一个项目,要求是有一些电力输送线,电力输送线或者石油管道都是有流动方向的,用户想做一个动态效果来模拟电力的输送.其实做简单了只要在线上标识个箭头就可以了.但也要是做成动态的,至少ArcEngine实现起来是有点麻烦的.但ArcGIS API for Silverlight可以解决这个问题. 实现思路 在地图上展示输送电力的线和模拟电力输送方向的电都是ArcGIS  API中定义的对象,否者这些数据在地图上

数据库操作:编辑表向线上表更新

需求:表edit需要将数据更新到表release,里边会涉及增删改操作,如何做比较好??? 1.edit表是最新的数据,release表是线上表. 2.会有不同的容器调用release表,也就是需要解决容器之间的锁的问题,其他容器只有读操作,正在操控的容器有读写操作,因为更新操作无法做到原子,所以在操作之间可能会遇到其他容器查询为空或读了一半等出错的状态 a.   在另外一张表version里,打上到底使用哪张表.   即读取数据的时候是在两个表之间来回跳跃的 以下操作在我们做update的容器

postgresql+postgis+pgrouting实现最短路径查询(1)---线数据的处理和建立拓扑

准备一个线shp数据,并将其导入postgres里面,postgres安装postgis和pgrouting两个插件(方法见http://www.cnblogs.com/nidaye/p/4553522.html).线数据的字段如下:注意字段的名称,省的出现不必要的麻烦. 1.ALTER TABLE beijing_line ADD COLUMN source integer; ALTER TABLE beijing_line ADD COLUMN target integer; ALTER T

如何消除 sql server 2008 查询语句的红色波浪线

近来学习sql的时候,所以就用上了sql server 2008 ,这个版本有个很好的地方就是会智能提示,但是这种智能提示有些时候这是很烦人,比如说新建一张数据表之后,表名为 Person当使用结构化查询语句的时候,输入Person 总是会出现红色波浪线(红色波浪线一般是提示有错误,但是这里并没错)百度上有个很好的解释:这个表的字段列表,让你选择.但是,当你新建了一个对象的时候, 例如表, 或者你的那个例子,是新建存储过程abc这个时候,数据库那里,已经有存储过程abc 了.但是客户端的缓存里面

浪潮存储:2015年发力高端 完善产品线布局

国内存储市场在过去多年都是国际品牌的天下,本土厂商一直处于市场竞争的弱势.近年来,随着本土品牌厂商在技术研发上的持续投入与积累,本土厂商开始崛起,逐渐在存储市场打开局面,正稳步成长为可以与国际品牌厂商叫板的一股力量.近日,浪潮存储对外宣布其2015年存储战略规划,直言2015年将会是浪潮存储改变的一年,结合以数据为核心,重点将会发力高端存储领域,并且会逐步完善存储产品线布局. 发力高端存储市场 一直以来,国内高端存储市场都是EMC.HDS以及IBM等国际厂商在唱主角,这些厂商凭借着多年的产品技术

【iOS知识学习】_iOS Label添加删除线

在做优惠价格的时候需要用到删除线,但是网上的删除线千篇一律,都是大抄小抄,其实苹果的NSAttributedString就可以实现这一点啦. 代码如下: NSString *oldPrice = @"¥ 12345"; NSUInteger length = [oldPrice length]; NSMutableAttributedString *attri = [[NSMutableAttributedString alloc] initWithString:oldPrice];

OC多线程之GCD ----- 2

dispatch_create生成的Queue不管是并行队列还是串行队列,其优先级都是默认优先级 但是可以用dispatch_set_target_queue来改变队列的优先级 dispatch_set_target_queue(原来的队列, 目标优先级队列) 使用这个函数需要获取两个队列,一个是需要变更优先级的队列,一个是指定优先级的队列(指定优先级的队列可以通过get_global获得) 如果多个串行队列优先级相同,那么这些队列里的任务也会串行执行 dispatch_after函数并不能非常