解决办法
1:子线程发message给主线程,去更新UI
private HandlerThread workerThread;
private static WorkerHandler workerHandler = null;
private static TimeoutHandler timeoutHandler = null;
workerThread = new HandlerThread("workerThread");
workerThread.setPriority(Thread.MIN_PRIORITY);
workerThread.start();
workerHandler = new WorkerHandler(workerThread.getLooper());
timeoutHandler = new TimeoutHandler(Looper.getMainLooper());//传主线程looper
private class WorkerHandler extends Handler {
private WorkerHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case XXXXXXXXXXXXX:
Message message = new Message();
message.what = a;
//Bundle 携带对象,对象需要实现序列化 ,此例使用Serializable进行序列化
Bundle bundle = new Bundle();
bundle.putSerializable("CachedBluetoothDevice",CachedBluetoothDevice);
message.setData(bundle);
timeoutHandler.sendMessage(message);
break;
}
}
}
private class TimeoutHandler extends Handler {
private TimeoutHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case a:
CachedBluetoothDevice ddevice = (CachedBluetoothDevice)msg.getData().get("CachedBluetoothDevice");
............................
break;
default:
break;
}
}
}
Bundle 对象实现序列化方式有2种
1: public class Xxxxx implements Serializable {}
2: public class Xxxxx implements Parcelable{
protected String _address = "";
protected String _name = "";
protected int _code;
public Xxxxx (Parcel parcel) {
_name = parcel.readString();
_address = parcel.readString();
_code = parcel.readInt();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(_name);
dest.writeString(_address);
dest.writeInt(_code);
}
public static final Creator<Xxxxx > CREATOR = new Creator<Xxxxx >() {
@Override
public Xxxxx createFromParcel(Parcel parcel) {
return new Xxxxx (parcel);
}
@Override
public Xxxxx [] newArray(int i) {
return new Xxxxx [i];
}
};
}
2:runOnUiThread
//注意判空
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
}
});