zoukankan      html  css  js  c++  java
  • 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;
    					}
    				});
    
    		 
    	}  	
    	
    	           
    }
    		


      


  • 相关阅读:
    python-django学习
    c++异常处理
    Python输入输出
    Python变量
    Python异常处理
    Python起源与发展
    vsftpd基于mysql的认证方式
    vsftpd搭建ftp服务,并实现虚拟用户访问
    httpd结合php的fpm模式
    编译安装apache
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3471443.html
Copyright © 2011-2022 走看看