ok i am making an app for some bluetooth works so there is thread class which i used to connected with other device and now i wanted to pass that thread class instance to another activity so i doesnt have to reconnect it therefore i implement that thread class as Parcelable but it doesnt work and throws NullPointer Exception.
Here is that threa class ClientThread.java:-
public class ClientThread extends Thread implements Runnable,Parcelable {
private BluetoothDevice device;
private final BluetoothSocket socket;
private Context context;
private BluetoothAdapter adapter;
private static String address = "14:36:05:7B:39:9B";//"98:D3:31:60:06:CA";
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private Handler handle;
protected InputStream is = null;
protected OutputStream os = null;
private boolean first;
private String password;
public ClientThread(Context context, Handler handle, String pass, boolean check) {
this.context = context;
adapter = BluetoothAdapter.getDefaultAdapter();
this.password = pass;
this.handle = handle;
this.first = check;
BluetoothSocket tmpSocket = null;
try {
device = adapter.getRemoteDevice(address);
tmpSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
socket = tmpSocket;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
adapter.cancelDiscovery();
socket.connect();
handle.sendEmptyMessage(2);
dataTransfer(socket);
} catch (IOException e) {
// TODO Auto-generated catch block
handle.sendEmptyMessage(3);
e.printStackTrace();
try {
socket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private boolean listen = true;
public void dataTransfer(BluetoothSocket soc) throws IOException {
is = soc.getInputStream();
os = soc.getOutputStream();
byte[] buffer = new byte[256];
int bytes;
if (first) {
send(("Validate" + password).getBytes());
first = false;
}
while (listen) {
try {
bytes = is.read(buffer);
handle.obtainMessage(1, bytes, -1, buffer).sendToTarget();
// final String data = new String(buffer, 0, bytes);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void send(byte[] buffer) {
try {
os.write(buffer);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void cancel() {
try {
listen = false;
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
int mData=0;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
}
public static final Parcelable.Creator<ClientThread> CREATOR = new Parcelable.Creator<ClientThread>() {
public ClientThread createFromParcel(Parcel in) {
return new ClientThread(in);
}
public ClientThread[] newArray(int size) {
return new ClientThread[size];
}
};
// example constructor that takes a Parcel and gives you an object populated with it's values
private ClientThread(Parcel in) {
mData = in.readInt();
socket=null;
}
}
Please help me how to correctly make it parcelable so that i could pass b/w activities
You cannot pass a Thread
via an Intent
extra, as a Thread
cannot be made Parcelable
or Serializable
. Either:
these should not be separate activities, but rather just one activity with a changing UI (e.g., via fragments); or
this thread should be managed by a Service
, particularly if the thread needs to be active even if the user navigates away from your app to something else; or
this thread should be managed carefully by some singleton and not be owned by either of the activities