0

是否可以ArrayList在扩展的类中使用Thread?我已经编写了一些代码来从正在工作的蓝牙串行读取,但我添加了一个ArrayList来跟踪我正在阅读的内容。但是,我正在NullPointException访问任何可以访问results的线路。我知道这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

4 回答 4

5

在您的构造函数中,您创建了一个与实例 ArrayList 同名的本地 ArrayList 引用,并对其进行了初始化。

List<String> results = new ArrayList<String>();  // This creates a local arraylist

因此,您的实例ArrayList引用仍然是null. 将该行更改为:

results = new ArrayList<String>();
于 2013-08-31T14:20:25.273 回答
1

您遇到的问题是您没有初始化实例变量,而只是初始化了同名的局部变量。

在构造函数中删除结果之前的列表。

于 2013-08-31T14:22:58.243 回答
1

这条线

List<String> results = new ArrayList<String>();

在局部变量上分配数组列表results。您可能认为它正在分配类成员。尝试更改为

results = new ArrayList<String>();
于 2013-08-31T14:21:52.057 回答
0
this.results = results; //do this in constructor
于 2013-08-31T14:22:24.323 回答