1. 程式人生 > >Android多程序理解一

Android多程序理解一

一、Java程序和執行緒

程序是作業系統進行資源分配和排程的一個獨立單位。 

獨立性(每個程序都有自己獨立私有的一塊記憶體空間)、動態性、併發性(多個程序可在單處理器上併發執行)

併發是指在同一時間點只能有一條指令執行,但多個程序指令被快速輪換執行,使得在巨集觀上具有多個程序同時執行的效果。

並行指在同一時間點,有多條指令在多個處理器上同時執行

執行緒 包含在程序中。一個程序可以包含多個執行緒。

不同的程序使用不同的記憶體空間,而執行緒共享父程序的資源。

執行緒不擁有系統資源,但是有自己的堆疊、自己的區域性變數和自己的計數器。

執行緒由程序負責排程。而程序由作業系統進行排程。

二、執行緒建立方法

1.繼承Thread類建立執行緒類

2.實現Runnable介面建立執行緒類

3.使用Callable和Future建立執行緒。(可以非同步返回值)

public class CallableAndFuture {
    public static void main(String[] args) {
        Callable<Integer> callable = new Callable<Integer>() {
            public Integer call() throws Exception {
                return new Random().nextInt(100);
            }
        };
        FutureTask<Integer> future = new FutureTask<Integer>(callable);
        new Thread(future).start();
        try {
            Thread.sleep(5000);// 可能做一些事情
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

三、執行緒狀態和排程

new、runnable、running、blocked、dead

join()方法。一個執行緒A中呼叫另一個執行緒B的join方法,執行緒A將會等待執行緒B執行完畢後再執行

setDaemon()方法。 設定程序為守護程序

yield()。執行緒轉入就緒狀態。讓出CPU執行權給同等級的執行緒,如果沒有相同級別的執行緒在等待CPU的執行權,則該執行緒繼續執行。

四、Java程序、執行緒通訊

程序間通訊包扣:管道、socket、共享記憶體、訊號量、訊息佇列、 訊號。

執行緒間通訊主要用於執行緒同步,沒有資料互動機制:鎖機制、訊號量、訊號。

五、Android程序分類

前臺程序、可見程序、服務程序、後臺程序、空程序

Android建立多程序,在AndroidManifest.xml的宣告四大元件的標籤中增加”android:process”屬性即可。

私有程序的名稱前面有冒號,全域性程序的名稱前面沒有冒號

私有程序
<service android:name=".MusicService"   
           android:process=":musicservice"/>
全域性程序
<service android:name=".MusicService"   
           android:process="com.demo.test.service"/>

開啟多程序之後,需要注意以下問題。

1. application的多次重建

2. 記憶體隔離問題

3. 檔案共享問題

六、Android程序間通訊IPC

1. Bundle-Intent:

startActivity(new Intent(...).putExtra("data",bundle));

2. 檔案共享:利用多程序同時讀寫同個外部檔案達到是資料互動的目的。讀寫檔案可能效率較低。這一用xml、文字、序列化物件等等

3. SP:通過讀取SP,進行資料通訊。這是一個輕量級的檔案共享的方案,底層也是用xml實現的,系統對它的讀寫有一定的快取(快取在記憶體中), 但是在多程序模式下,系統對它的讀寫是不可靠的,高併發下可能發生資料丟失。

4.  Messenger:在不同的程序之間傳遞Messager物件。 輕量級的AIDL

5.  AIDL。基本原理是binder機制。

6.  ContentProvider。使用共享記憶體的基本原理。

七、Andoroid執行緒間通訊

1. Handler機制

  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ButterKnife.bind(this)
/*        var value = intent.getIntExtra("key", 0)
        Log.i("------------>", value.toString())*/

        crateNewThread()
    }

    var handler = object : Handler() {
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            when(msg?.what) {
                1 -> {
                    Log.i("----------->", msg.obj.toString())
                }
                else ->{

                }
            }
        }

    }

    private fun crateNewThread() {
        Thread(object : Runnable{
            override fun run() {
                var message = Message()
                message.what = 1
                message.obj = "Handler 通訊"
                handler.sendMessage(message)
            }
        }).start()
    }


    override fun onDestroy() {
        handler.removeCallbacksAndMessages(null)
        super.onDestroy()

    }

2. runOnUiThread 方法

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ButterKnife.bind(this)
/*        var value = intent.getIntExtra("key", 0)
        Log.i("------------>", value.toString())*/

        crateNewThread()
    }

    private fun crateNewThread() {
        Thread(object : Runnable {
            override fun run() {
                for(i in 1..3) {//為了練習kotlin for迴圈 沒其他意思
                    sleep(1000)
                }
                runOnUiThread( object : Runnable {
                    override fun run() {
                        tv_main_news_tab.setText("通過RunOnUI 呼叫")
                    }
                })
            }
        }).start()
    }

3. View.post(Runnable r) 

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ButterKnife.bind(this)
/*        var value = intent.getIntExtra("key", 0)
        Log.i("------------>", value.toString())*/

        crateNewThread()
    }

    private fun crateNewThread() {
        Thread(object : Runnable {
            override fun run() {
                for(i in 1..3) {//為了練習kotlin for迴圈 沒其他意思
                    sleep(1000)
                }
                tv_main_news_tab.post( object : Runnable {
                    override fun run() {
                        tv_main_news_tab.setText("通過RunOnUI 呼叫")
                    }
                })
            }
        }).start()
    }

4. AsyncTask

  override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ButterKnife.bind(this)
/*        var value = intent.getIntExtra("key", 0)
        Log.i("------------>", value.toString())*/

        /*crateNewThread()*/

        doAsyncTask()
    }

    private fun doAsyncTask() {
        MyAsyncTask().execute()
    }

     private class MyAsyncTask : AsyncTask<String, Int, String>() {

         override fun onPreExecute() {
             super.onPreExecute()
         }

         override fun doInBackground(vararg params: String?): String {
             for ( i in 1..100) {
                publishProgress(i)
                 sleep(1000)
             }
             return "AsyncTask 已完成"
         }

         override fun onPostExecute(result: String?) {
             super.onPostExecute(result)
             CommonToast.showShort(result.toString())
         }

         override fun onProgressUpdate(vararg values: Int?) {
             super.onProgressUpdate(*values)
             CommonToast.showShort(values.get(0).toString())
         }

     }