• [Android学习系列18]线程,进程,异步的一些事


    粗俗理解:

    线程安全和非线程安全:   一样东西(变量或代码),可以同时被多个线程操作修改,可是一个线程还没搞完它,另一个线程又插进来搞,就会出错,就不安全。

    所以一个办法是,一个线程在搞它的时候,确保自己搞完以后其他线程才能进来搞,这样就叫线程安全。

     

     

     

    android的UI操作只能由主线程(UI线程)来搞,但是有时候我们要从网络等地方获取数据等操作会开启另一个线程,同时这个数据又要更新到界面里,怎么办?(子线程不能修改UI)

    第一种实现:  new一个thread,然后在thread的runnable里面获取数据,然后发消息和数据 给主线程的handler,让handler去更新界面

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        
        <TextView
            android:id="@+id/textview1"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
             />
        
        <Button 
            android:id="@+id/button1"
            android:text="点我更新"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
       
    
    </LinearLayout>
    
    
    
    
    
    public class ActivityMain extends Activity {
        
        TextView textview;
        Button bt1;
        Handler handler;
        String textcontent;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            textview = (TextView)findViewById(R.id.textview1);
            textview.setText("更新前");
            bt1 = (Button)findViewById(R.id.button1);
            
            
            handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    //等通知过来 我就更新界面
                    textview.setText(textcontent);
                    
                }
            };
            
            
            
            bt1.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    
                    //启动一个线程   假设这个线程是用来更新获取数据的
                    new Thread( new Runnable() {
                        
                        @Override
                        public void run() {
                            
                            //这里是子线程
                            //假设这里已经从网络获取了数据
                            //textview.setText("更新后的数据");  //这样不行 报一个 only original thread can xxx 的错
                            
                            textcontent = "更新后的数据";
                            //通知主线程的handler去更新
                            handler.sendEmptyMessage(0);
                            
                            
                        }
                    }).start();
                    
                    
                
                }
            });
            
            
            
            
        }
    
    }
    View Code

    第二种实现:  使用runOnUiThread

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        
        <TextView
            android:id="@+id/textview1"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
             />
        
        <Button 
            android:id="@+id/button1"
            android:text="点我更新"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
       
    
    </LinearLayout>
    
    
    public class ActivityMain extends Activity {
        
        TextView textview;
        Button bt1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            textview = (TextView)findViewById(R.id.textview1);
            textview.setText("更新前");
            bt1 = (Button)findViewById(R.id.button1);
            
            
            
            
            bt1.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    
                    //启动一个线程   假设这个线程是用来更新获取数据的
                    new Thread( new Runnable() {
                        
                        @Override
                        public void run() {
                            
                            //这里是子线程
                            //假设这里已经从网络获取了数据
                            //textview.setText("更新后的数据");  //这样不行 报一个 only original thread can xxx 的错
                
                            // 用runOnUiThread方法里面的Runnable    相当于主线程(UI线程)
                            runOnUiThread( new Runnable() {
                                public void run() {
                                    
                                    textview.setText("更新后的数据");  //感觉好多了
                                }
                            });
                            
                            
                        }
                    }).start();
                    
                    
                
                }
            });
            
            
            
            
        }
    
    }
    View Code

    第三种实现:

     

    解决NetworkOnMainThreadException

    http://www.aitinan.com/4387.html

     

     

     

    参考:

    android进程线程详解一:进程

    android进程线程详解二:线程

    android进程线程详解三:AsyncTask

    android进程线程详解四:线程安全和进程间通信

    Android更新UI的两种方法——handler与runOnUiThread()

    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0302/946.html

    探讨android更新UI的几种方法

    http://blog.csdn.net/dyllove98/article/details/9304435

  • 相关阅读:
    ORACLE 查找数据库中有记录的表
    [原]Asp.Net 错误:无法连接到Asp.Net Developement server
    中国移动手机话费查询号码1008611
    动手修改VS2008的解决方案文件,以让VS2005打开它
    [转]飞秋使用说明与常见问题解决方法
    微软发布Fix it 修复Windows 7等系统0day漏洞
    Oracle DECODE 函数应用示例
    [转]C#实现访问网络共享文件夹
    c#保留小数点后位数的方法
    [转]微软紧急修复高危漏洞 30万网民PC已遭攻击
  • 原文地址:https://www.cnblogs.com/sleeptothedeath/p/3699274.html
Copyright © 2020-2023  润新知