Android 启动线程

============问题描述============

private int i = 0;

	private int x = 0;

	@Override

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		setContentView(R.layout.hello_world_layout);

		 

		Button b = (Button) findViewById(R.id.button);

		final TextView v2 = (TextView) findViewById(R.id.t2);

		new Thread() {

			public void run() {

				try {

					Thread.sleep(1000);

				} catch (InterruptedException e) {

					// TODO Auto-generated catch block

					e.printStackTrace();

				}

				v2.setText(x++ + "");

			};

		}.start();

初学者  写了一个线程  。这样会出错,求解

============解决方案1============

setText 需要对 view 重新绘制,显示文本 而在 android 里对 view 重新进行绘制的话,需要在主线程中调用,或者使消息进入 Looper 队列

============解决方案2============

UI控件的函数setText只能在UI线程里调用,否则会导致异常。

可以用AsyncTask来处理。

============解决方案3============

示例代码

public class MainActivity extends Activity {

	private Button incButton;

	private TextView msgTextView;

	private int count = 0;

	@Override

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		msgTextView = (TextView)findViewById(R.id.msgTextView);

		incButton = (Button)findViewById(R.id.incButton);

		incButton.setOnClickListener(new View.OnClickListener() {

			@Override

			public void onClick(View v) {

				AsyncTask<Void, Void, String> thread = new AsyncTask<Void, Void, String>() {

					@Override

					public String doInBackground(Void... params) {

						count++;

						return String.format("%d", count);

					}

					@Override

					public void onPostExecute(String msg) {

						msgTextView.setText(msg);

					}

				};

				thread.execute();

			}

		});

	}

}

============解决方案4============

或者把线程封装成一个内部类,这样代码就会写得更简洁优雅:

public class MainActivity extends Activity {

	private Button incButton;

	private TextView msgTextView;

	private int count = 0;

	@Override

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_main);

		msgTextView = (TextView)findViewById(R.id.msgTextView);

		incButton = (Button)findViewById(R.id.incButton);

		incButton.setOnClickListener(new View.OnClickListener() {

			@Override

			public void onClick(View v) {

				new MyTask().execute();

			}

		});

	}

	private class MyTask extends AsyncTask<Void, Void, String> {

		@Override

		public String doInBackground(Void... params) {

			count++;

			return String.format("%d", count);

		}

		@Override

		public void onPostExecute(String msg) {

			msgTextView.setText(msg);

		}

	}

}
时间: 2024-08-01 10:44:55

Android 启动线程的相关文章

Android的线程和线程池

原文链接,转载请注明出处 http://sparkyuan.me/2016/03/25/Android的线程和线程池/ 在Java中默认情况下一个进程只有一个线程,也就是主线程,其他线程都是子线程,也叫工作线程.Android中的主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作.线程的创建和销毁的开销较大,所以如果一个进程要频繁地创建和销毁线程的话,都会采用线程池的方式. Android中线程的形态 传统的Thread AsyncTask HandlerThread IntentS

Android技术11:Android的线程模型

1.Android的单线程模型 在android应用程序启动时,Android会同时启动一个对应的主线程Main Thread.主线程主要负责处理UI方面的事件,所以又称UI线程.Android应用程序必须遵守单线程模型原则:androidUI操作不是线程安全的,并且这些操作必须在UI线程中完成.UI线程负责事件监听和绘图处理,因此必须保证UI线程能够随便响应用户,所以那些非常耗时的,必须放到其他线程中处理,如网络连接,数据库读取等操作,否超过一定时间没有响应,则应用程序就会终止. 2.消息队列

Android UI线程和非UI线程

UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,你的应用和Android的UI组件(components from the Android UI toolkit (components from the android.widget and android.view packages))发生交互. 所以main thread也叫UI thread也即UI线程. 系统不会为

java android ExecutorService 线程池解析

ExecutorService: 它也是一个接口,它扩展自Executor接口,Executor接口更像一个抽象的命令模式,仅有一个方法:execute(runnable);Executor接口简单,可是非常重要,重要在这样的设计的模式上..Java5以后,通过Executor来启动线程比用Thread的start()更好.在新特征中,能够非常easy控制线程的启动.运行和关闭过程,还能够非常easy使用线程池的特性. 几种不同的ExecutorService线程池对象 1.newCachedT

android启动之SystemServer启动

SystemServer是Android系统的核心,APK应用中能够直接交互的大部分系统服务都在该进程中运行,常见的比如WindowManagerServer(Wms).ActivityManagerSystemService(AmS). PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中. startSystemServer systemServer是通过zygote启动的时候fork启动的,我们先看回到ZygoteIni

android启动之子系统切换

转载请注明文章出处和作者! 出处:http://blog.csdn.net/xl19862005 大家多多支持偶家媳妇的网店:http://wen1991.taobao.com 作者:大熊(Xandy) 1.总述 在android系统中有好几个子系统(recovery.factory及power off charge),那么这些子系统是如何与主系统之间进行切换的呢? (recovery系统的切换与启动已经在另一篇博客里写过了 http://blog.csdn.net/xl19862005/art

Android子线程更新UI主线程方法之Handler

背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. 下面说下有关Handler相关的知识. 多线程一些基础知识回顾:在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的方法有两种:通过继承Thread类,重写Run方法来实现通过继承接口Runnable实现多线程 具体两者的区别与实现,看看这篇文章中的介绍:http://de

android启动之zygote启动

上一博文介绍了init进程启动,在解析init.rc 的时候会把zygote加到service列表中,并最终启动,zygote启动的实际是app_process程序.zygote是init进程的子进程.在Android系统中,所有的应用程序以及系统服务,包括SystemServer都是由Zygote fork出来的,这就是为什么它叫zygote(受精卵)的原因.我们再来看一下.rc文件的描述: service zygote /system/bin/app_process -Xzygote /sy

android启动界面

启动界面的效果图: 实现的原理:在一个线程中让几幅图片进行循环显示,实现了动画的效果. 主要的实现类LoadingView是自定义控件,继承了ImageView,实现了Runnable接口 : package wht.android.loading; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.widget.Imag