码迷,mamicode.com
首页 > 移动开发 > 详细

android 子线程真的不能更新ui吗

时间:2015-06-29 10:03:52      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

在实际的开发中,子线程肯定是不能更新ui的,但是在测试的代码中,我们可以实现子线程中更新ui的功能,例如:一个textview 在oncreate生命周期方法中进行findviewbyid

然后紧接着写一个线程,在线程中直接对这个textview进行settext,你就会发现奇迹竟然就那么发生了,竟然真的更新了ui,而app竟然没有cresh掉,顿时就惊呆了

然后分别尝试在onstart onresume 方法中进行子线程更新ui的操作,竟然都可以更新,但是此时有一个地方需要注意,当我们程序的onresume生命周期方法执行完毕之后,此时再在子线程中更新ui就会报错,例如,在一个button的点击事件中更新ui,此时onresume肯定已经执行完毕,这个时候肯定是会报错的.原因是在第一次的oncreate onstart onresume 生命方法中.activity的rootviewimpl还没有创建出来.这个时候进行更新ui是没有问题的.但是当rootviewimpl创建出来之后,就不能再在子线程中更新ui了.所以说子线程中更新ui的方式在实际的开发中完全用不到.关键时刻还是要用thread hanler的方式进行ui的更新


下面是示例程序:

技术分享


activity:

package com.example.testchildthreadgootheractivity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

	private Context context;
	private TextView tv_result;
	private Button btn_refresh;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		context = this;
		initVeiw();
		Log.e("test", "main thread,name:" + Thread.currentThread().getName()
				+ ",id:" + Thread.currentThread().getId());

		new Thread(new Runnable() {
			@Override
			public void run() {
				Log.e("test", "child thread,name:" + Thread.currentThread().getName()
						+ ",id:" + Thread.currentThread().getId());
				tv_result.setText("oncreate refresh textview");
			}
		}).start();

	}

	@Override
	protected void onStart() {
		super.onStart();
		new Thread(new Runnable() {
			@Override
			public void run() {
				Log.e("test", "child thread,name:" + Thread.currentThread().getName()
						+ ",id:" + Thread.currentThread().getId());
				tv_result.setText("onstart refresh textview");
			}
		}).start();
	}

	@Override
	protected void onResume() {
		super.onResume();
		new Thread(new Runnable() {
			@Override
			public void run() {
				Log.e("test", "child thread,name:" + Thread.currentThread().getName()
						+ ",id:" + Thread.currentThread().getId());
				tv_result.setText("onresume refresh textview");
			}
		}).start();
	}

	private void initVeiw() {
		tv_result = (TextView) findViewById(R.id.tv_result);
		btn_refresh = (Button) findViewById(R.id.btn_refresh);

		btn_refresh.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				new Thread(new Runnable() {
					@Override
					public void run() {
						Log.e("test", "child thread,name:" + Thread.currentThread().getName()
								+ ",id:" + Thread.currentThread().getId());
						tv_result.setText("onresume refresh textview");
					}
				}).start();
			}
		});
	}

	@Override
	protected void onPause() {
		super.onPause();
		Log.e("test", "onPause");
	}

	@Override
	protected void onStop() {
		super.onStop();
		Log.e("test", "onStop");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.e("test", "onDestroy");
	}

	@Override
	protected void onRestart() {
		super.onRestart();
		Log.e("test", "onRestart");
	}
}

android 子线程真的不能更新ui吗

标签:

原文地址:http://blog.csdn.net/u010399316/article/details/46677257

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!