android 反纠结app开发: 在线程中更新view


 大体上想实现一个思路:

         对一个view 的内容进行不停地变化, 通过按钮停止这种变化,以达到随机选择的目的.


        开发过程中 使用textview 模拟,  建立线程 

mythread = new Thread()

{

     @Override

   public void run()

  {

      while(isrun)

    {

         改变textview

    }

  }

}

 结果遭遇报错 Only the original thread that created a view hierarchy can touch its views


  通过在网上查阅大量资料, 得知android 的view 和相关控件不是线程安全的,不可以在线程中直接改变.


这种情况下 需要使用handle .


 

通过Handler更新UI实例:

 

步骤:

1、创建Handler对象(此处创建于主线程中便于更新UI)。

2、构建Runnable对象,在Runnable中更新界面。

3、在子线程的run方法中向UI线程post,runnable对象来更新UI。

 

在下面的代码中, 通过变量ab  ,不断更新textview中的内容 ,通过按钮可以结束线程.


 

import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;

import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity  {

	private Button button;
	private TextView textview;
	private final int SPLASH_DISPLAY_LENGHT = 1;
	private static int flag = 0;
	private static int count=0;
	private int ab=1;
	private boolean isrun = true;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		button = (Button)findViewById(R.id.button1);
		textview = (TextView)findViewById(R.id.textView1);
		final Handler handler= new Handler();  
		  
		   final Runnable runnable = new Runnable() {  
		        public void run() {  
		            textview.setText(Integer.toString(ab));  
		        }  
		    };  
		  
		
		        
		        
		    final Thread t = new Thread(){
		        	//public boolean isrun=true;
		    	@Override
		            public void run() {  
		            	while(isrun)
		            	{
		                handler.post(runnable); //加入到消息队列     这样没有启动新的线程,虽然没有报异常。但仍然阻塞ProgressDialog的显示  
		                ab++;
		                try {
		                    sleep(1000);                            //直接调用
		                  } catch (InterruptedException e) {
		                    return;
		                  }
		            	}
		            }  
		        };  
		        t.start();  
		        button.setOnClickListener(new Button.OnClickListener()
				{
					@Override
					public void onClick(View view)
					{
						isrun=false;
					}
				});

		 
	}  	
	
	           
}
		


 

  


 

posted on 2013-12-12 16:30  我的小人生  阅读(314)  评论(0编辑  收藏  举报