如何使用parcelable将线程类对象从activity传递给activity

时间:2016-04-15 17:04:07

标签: java android multithreading bluetooth parcelable

好吧我正在为一些蓝牙工作制作应用程序,所以有线程类,我曾经与其他设备连接,现在我想将该线程类实例传递给另一个活动所以我不必重新连接它因此我实现了线程类为 Parcelable 但它不起作用并抛出 NullPointer异常。

  

这是threa类 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;
}

}
  

请帮助我如何正确地使其成为可分辨的,以便我可以通过黑白活动

1 个答案:

答案 0 :(得分:4)

由于Thread无法IntentThread,您无法通过Parcelable附加内容传递Serializable。之一:

  • 这些不应该是单独的活动,而只是一个具有不断变化的UI的活动(例如,通过片段);或

  • 此线程应由Service管理,特别是如果线程需要处于活动状态,即使用户从您的应用程序导航到其他内容也是如此;或

  • 这个帖子应由一些单身人士小心管理,不属于任何一项活动