1. 程式人生 > 資料庫 >安卓撥號器(AS+SQLite+ModelView)

安卓撥號器(AS+SQLite+ModelView)

百度網盤工程zip下載連結:
提取碼:pjyz 
 

目錄


專案中遇到的一些小問題

1.非ui執行緒裡面修改介面資料,一定要通知

2.定義一個entity類時,實現Serializabel介面的目的?

如果需要傳送該類資料,使用Handler可以用handler.setData(new Bundle().putSerializable(資料物件))來實現

3.另外在安卓訪問資料庫,要在主執行緒進行,會導致頁面很卡。可以寫一個子執行緒進行訪問。如何將子執行緒訪問到的資料傳送給主執行緒呢?

方法:可以使用Handler機制,主執行緒建立Handler物件,子執行緒使用。

所謂的在子執行緒通過handle傳送訊息,然後回主執行緒處理訊息,通過handleMessage進行UI的更新,這個例子其實很常見,就是在主執行緒中我們通過建立一個mainHandler物件,然後並重寫這個handler的handleMessage函式,並在子執行緒中通過主執行緒中建立的這個mainHandler來發送訊息給主執行緒。

其實在主執行緒中建立的這個mainHandler,他在new的時候,就會自動的和主執行緒中的looper物件進行繫結,而looper物件裡只有一個messageQueue,所以這樣3者就建立了聯絡。同時主執行緒中的Looper會不停的loop,在這個loop函式裡面他會不斷的取looper物件裡面的MessageQueue中的massage,然後呼叫訊息目標(傳送訊息的handler)的handleMessage。其實這一切都是在主執行緒下執行的,所以才能進行UI的更新。

那麼在子程序中傳送訊息,其實只是在子執行緒中引用了mainHander這個handler物件,並呼叫該handler物件的sendMessage函式傳送訊息,而傳送訊息函式sendMessasge函式所做的事情,是將需要傳送出去的這個message放入handler物件的訊息佇列中,就完事了。注意:這裡的傳送訊息,僅僅是將訊息入隊到呼叫傳送訊息的那個handler物件的訊息佇列中,而不是呼叫傳送訊息的這個子執行緒的訊息佇列中。

例如mainHandler.sendEmptyMessage(0)這個函式,他入隊訊息的佇列是mainHandler對應的MessageQueue中,跟呼叫傳送訊息的佇列無關。

4.主執行緒用Hadler接受子執行緒訊息,需要將宣告靜態的MtHadler類繼承Hanler類:

主執行緒:

子執行緒:

 

5.讀取res/raw資料夾下的資料使用io流,虛擬機器的檔案系統與電腦檔案系統不一樣!不要用絕對路徑讀取資料。

 

6.AS下使用輕量級的資料庫SQLite

雙擊可以開啟:

8.當需要MainActivity和子Fragment共享一個viewModel時,在fragment裡面一定是

ViewModelProviders.of(getActivity()).get(MyViewModel.class)

而不是

ViewModelProviders.of(this).get(MyViewModel.class)

9.SQLite語法編寫錯誤,字串兩側加' '