編輯:關於Android編程
按Google開發文檔的說法,在跨進程通信時,推薦使用MessengerService而不是AIDL,所以最近在實現一個跨進程的Service時就采用了MessengerService的方法。
然後定義了這樣一個類:
public class BleServiceBean implements Parcelable {
private String name;
private String uuid;
public BleServiceBean()
{
}
public BleServiceBean(BluetoothGattService service)
{
uuid=service.getUuid().toString();
name= BleNamesResolver.resolveServiceName(uuid);
}
private BleServiceBean(Parcel in)
{
readFromParcel(in);
}
private void writeToParcel(Parcel out)
{
out.writeString(name);
out.writeString(uuid);
}
@Override
public int describeContents()
{
return 0;
}
@Override
public void writeToParcel(Parcel out,int flags)
{
writeToParcel(out);
}
public void readFromParcel(Parcel in)
{
name=in.readString();
uuid=in.readString();
}
public static final Parcelable.CreatorCREATOR=new
Parcelable.Creator(){
@Override
public BleServiceBean createFromParcel(Parcel source)
{
return new BleServiceBean(source);
}
@Override
public BleServiceBean[]newArray(int size)
{
return new BleServiceBean[size];
}
};
}
在Service中獲取到相應數據後要傳遞給UI,有如下代碼:
Bundle bundle=new Bundle();
bundle.putParcelableArrayList(BleConnectUtils.BLE_SERVICE_BEAN_LIST,beanList);
msg.setData(bundle);
mClients.get(i).send(msg);
在Client端獲取數據的代碼如下:
ArrayList但是運行到此處時卻出現如下錯誤:beanList=bundle.getParcelableArrayList(BleConnectUtils.BLE_SERVICE_BEAN_LIST);
FATAL EXCEPTION: main
Process: com.example.xxx.xx, PID: 1203
android.os.BadParcelableException: ClassNotFoundException when unmarshalling:
給出的出錯原因如下:
Caused by: java.lang.ClassNotFoundException: Didn't find class com.example.xxx.xxx.bean.BleServiceBean on path: DexPathList[[directory .],nativeLibraryDirectories=[/vendor/lib, /data/cust/lib, /system/lib]]
後面才發現原來是Android有兩種不同的classloaders:framework classloader和apk classloader,其中framework classloader知道怎麼加載android classes,apk classloader知道怎麼加載你的代碼,即可以知道你自定義的類,apk classloader繼承自framework classloader,所以也知道怎麼加載android classes。在應用剛啟動時,默認class loader是apk classloader,但在系統內存不足應用被系統回收會再次啟動,這個默認class loader會變為framework classloader了,所以對於自己的類會報ClassNotFoundException。
如果是在要傳遞的JavaBean中有其中一個Field繼承自Parcelable,那麼有很簡單的處理方法,只要把類似rect = in.readParcelable(null);改為config = in.readParcelable(Rect.class.getClassLoader());
但是我們這裡是直接傳遞一個List
其實很簡單,只需要在Client端讀取Bundle中的數據之前加上如下一行代碼:
bundle.setClassLoader(getClass().getClassLoader());這樣就會使用apk classloader加載。
Android Retrofit文件下載進度顯示問題的解決方法
綜述 在Retrofit2.0使用詳解這篇文章中詳細介紹了retrofit的用法。並且在retrofit中我們可以通過ResponseBody進行對文件的下載。但是在r
Android VideoView本地視頻播放
本文將講解使用VideoView播放本地視頻,使用起來相對簡單,在其中添加了MediaController類來實現更多的視頻控制功能。 實現效果圖: 代碼; 布局文件
Android消息提示類viewbadger
Android消息提示類viewbadger ,效果如下: 代碼如下 BadgeView.java import android.content.Context
Android把商品添加到購物車的動畫效果(貝塞爾曲線)
當我們寫商城類的項目的時候,一般都會有加入購物車的功能,加入購物車的時候會有一些拋物線動畫,具體代碼如下:實現效果如圖:思路: 確定動畫的起終點 在起終點之間使用二次