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())
}
}