我可以在扩展Thread的类中使用ArrayList吗?

时间:2013-08-31 14:18:06

标签: java android arraylist

是否可以在扩展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
    }
}

4 个答案:

答案 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