是否可以在扩展ArrayList
的类中使用Thread
?我已经编写了一些代码来读取蓝牙序列的功能,但是我添加了一个ArrayList
来跟踪我正在阅读的内容。但是,我在访问结果的任何行上都获得了NullPointException
。
我知道ArrayList
不是线程安全的(虽然我可能不完全理解这意味着什么)所以我可能会尝试做不可能的事情,但我想我会与专家核实,因为ArrayLists很容易使用
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private List<String> results;
public ConnectedThread(BluetoothSocket socket) {
Log.d(TAG, "create ConnectedThread");
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
List<String> results = new ArrayList<String>();
// Get the BluetoothSocket input and output streams
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
init();
}
private void init(){
code = new byte[16];
checksum = 0;
tempbyte = 0;
bytesread = -1;
if(!results.isEmpty()){
Log.i(TAG, "Already have found: " + results.size() + " things.");
}
}
public void run(){
//do things
}
}
答案 0 :(得分:5)
在构造函数中,您创建了一个与实例ArrayList同名的本地ArrayList引用,并初始化它。
List<String> results = new ArrayList<String>(); // This creates a local arraylist
因此,您的实例ArrayList
引用仍为null
。将该行更改为:
results = new ArrayList<String>();
答案 1 :(得分:1)
这一行
List<String> results = new ArrayList<String>();
在本地变量results
上分配数组列表。你可能认为它正在分配类成员。尝试更改为
results = new ArrayList<String>();
答案 2 :(得分:1)
您遇到的问题是您没有初始化您的实例变量,而只是初始化具有相同名称的局部变量。
在构造函数中删除结果之前的结果。
答案 3 :(得分:0)
this.results = results; //do this in constructor