在实际的开发中,子线程肯定是不能更新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"); } }
原文:http://blog.csdn.net/u010399316/article/details/46677257