編輯:關於Android編程
這個錯誤翻譯的意思是:不能在沒有Looper.prepare的線程裡面創建handler。
起初我很疑惑,我根本沒有用到工作線程,也沒有創建handler。報錯的代碼如下:
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
final iBeaconClass.iBeacon ibeacon = iBeaconClass.fromScanData(device, rssi, scanRecord);
if (mFilter.isDevice(ibeacon)) {
scanLeDevice(false);//停止掃描
T.showShort(getActivity(), getString(R.string.sign_in_success));
AppSettings.setPrefString(getActivity(), Config.ISSIGNIN, mCurrentDate);
setButtonState();//改變按鈕的狀態
DialogUtils.proGone();
// mControl.closeBlue();//關閉藍牙
}
}
};
百度了下,網上的做法是如下:
Looper.prepare();
BluetoothAdapter.getDefaultAdapter();
在獲取BluetoothAdapter的之前,加上Looper.prepare();,然並卵。問了很多人,都說不知,這時候這能自力更生了。最後終於被我找到解決辦法。
思路:我查看了SDK的源碼,發現原來我再調用Toast的時候,創建了handler,源碼如下,
當我查看TN這個類的時候,就發現了問題的所在
類 TN 是一個aidl的.Stub的子類,而Toast的顯示和隱藏都是通過此類進行通信的,而裡面使用handler,具體原理我就不深究下去了。我於是猜想 new BluetoothAdapter.LeScanCallback()的onLeScan可能並沒有運行在主線程,於是我調用了runOnUiThread()方法,結果果然解決了。修改後代碼如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
final iBeaconClass.iBeacon ibeacon = iBeaconClass.fromScanData(device, rssi, scanRecord);
if (mFilter.isDevice(ibeacon)) {
scanLeDevice(false);//停止掃描
getActivity().runOnUiThread(new Runnable() {//UI線程的控件改變狀態,需要調用此方法,不然可能會無效
@Override
public void run() {
T.showShort(getActivity(), getString(R.string.sign_in_success));
AppSettings.setPrefString(getActivity(), Config.ISSIGNIN, mCurrentDate);
setButtonState();
DialogUtils.proGone();
// mControl.closeBlue();//關閉藍牙
}
});
}
}
};
到此,問題已解決,為了讓其他同道碰到此問題,而減少尋找bug的時間,特寫此博客,告知!
在android系統中主要提供了三種方式用於簡單的實現數據持久化功能,即文件存儲,SharePreference存儲以及數據庫存儲。當然還可以把數據保存到SD卡中。
244.http請求的url含有中字符時,需要Uri編碼。Uri.encoder()245.使用androidstudio時,不知道什麼原因svn不見了Android S
socket編程是網絡通信的一個基礎應用,無論是手機端還是PC端都需要socket技術來建立網絡通信。在本章小編主要從以下幾個方面來介紹socket的相關知識:分別是&l
在剛學習Android的時候就想自己手寫一個索引,但是當時還是彩筆,就一直沒做,昨天寫了一個索引,今天貼出來,以備後用,先上圖: 由於列表是我自己封裝的,可能必看到展示頁