[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

原文地址:https://www.cnblogs.com/sleeptothedeath/p/3699274.html