Search code examples
javaandroidmultithreadingbluetoothparcelable

how to pass a thread class object from activity to activity using parcelable


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


Solution

  • 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