Android 學習系列 - 線程模型

線程模型

  1. android UI 線程java

  2. 如何使用 child-processandroid

ANR 錯誤

因爲單線程而致使的ANR錯誤: ANR錯誤(Application Not Responding),指主UI進程被阻塞超過5秒鐘而出現的錯誤,它會終止程序的正常運行,咱們要避免它 ,而產生ANR錯誤的緣由就是:單線程。app

public class MainActivity extends Activity {
        private Button btn;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn=(Button) findViewById(R.id.btn);
            btn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    int count=0;
                    while(count<1000){
                        count++;
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }); 
        }
    }

改成ide

private Thread thread;
    thread=new Thread(new Runnable() {
        @Override
        public void run() {
            int count=0;
            while(count<1000){
                count++;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(count);
            }
        }
    });
    thread.start();//啓動線程
    thread.stop();//中止線程

但若是用這個線程來更新UI一樣會遇到錯誤oop

Android線程之間的通訊——Handler

其實,Android線程之間的通訊不僅是Handler,還須要Message,MessageQueue,Looper的相互使用,Android線程通訊模型以下:post

Thread ->[handler] -> Loop(message|> messageQueue) <- UI Thread(main thread)線程

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
    private Button btn_start,btn_stop;
    private TextView tv;
    private int i=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_start=(Button) findViewById(R.id.button1);
        btn_stop=(Button) findViewById(R.id.button2);
        tv=(TextView) findViewById(R.id.textView1);
        btn_start.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //開始發送消息
                handler.post(runnable);
            }
        });
        btn_stop.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //中止發送消息
                handler.removeCallbacks(runnabl);
            }
        });
    }
    //建立新的線程
    private Runnable runnable=new Runnable() {
        @Override
        public void run() {
            i++;
            //使用Message封裝非UI線程的消息
            Message m=new Message();
            //使用Message的arg1屬性或者arg2屬性傳遞int類型的消息效率高
            m.arg1=i;
            //使用Handler發送消息
            handler.sendMessage(m);
        }
    };
    @SuppressLint("HandlerLeak")
    private Handler handler=new Handler(){
        public void handleMessage(Message m){
            System.out.println(m.arg1);
            String str=m.arg1+"";
            tv.setText(str);
            handler.post(runnable);
        }
    };
}
  1. Message:即要傳遞的消息;code

  2. MessageQueue:存放消息的隊列;隊列

  3. Looper:用於建立MessageQueue以及循環使用其中的Message;進程

  4. Handler:用於消息的傳遞了;

一、handler
二、Activity.runOnUIThread(Runnable)
三、View.Post(Runnable)
四、View.PostDelayed(Runnabe,long)
五、AsyncTask

  1. Thread , Runnable

AsyncTask

// <!-- MainActivity -->
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
    private Button btn1,btn2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn1=(Button) findViewById(R.id.button1);
        btn2=(Button) findViewById(R.id.button2);
        btn1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //建立AsyncTask並執行
                new MyAsyncTask().execute();
            }
        });
        btn2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                System.out.println("Hello To EveryOne");
            }
        });
    }
}

// <!--  MyAsyncTask.java  -->
import android.os.AsyncTask;
/**
 * 在後臺建立線程,不會出現卡屏現象
 * @author asus
 */
public class MyAsyncTask extends AsyncTask<Void, Void, String>{
    //核心方法,在後臺啓動一個線程
    @Override
    protected String doInVoid(params) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }
}
相關文章
相關標籤/搜索