2016-04-15 166 views
0

好的我正在为一些蓝牙作品制作应用程序,所以有线程类,我用它与其他设备连接,现在我想将该线程类实例传递给另一个活动,所以我不必重新连接它,因此我实现该线程类作为Parcelable但它不工作,并抛出空指针异常。如何将线程类对象从活动传递到使用parcelable的活动

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

} 

请帮助我如何正确地使它parcelable,这样我可以传递的B/W活动

回答

3

您无法通过Intent额外的Thread,作为Thread无法制作ParcelableSerializable。或者:

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

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

  • 这个线程应该管理仔细一些独立的,并没有任何

+0

OK,你可以展示如何实现这一目标的活动或任何referel环节所拥有 –

相关问题