0

ArrayListを拡張するクラス内でを使用することは可能Threadですか? 動作していた Bluetooth シリアルから読み取るコードをいくつか書きましたが、ArrayList読み取っているものを追跡するために を追加しました。ただし、 resultsNullPointExceptionにアクセスする任意の行にアクセスしています。私はそれがスレッドセーフではないことを知っています (それが何を意味するのか完全には理解していないかもしれません) ので、不可能なことをしようとしているのかもしれませんが、ArrayLists はそれ以外の場合は非常に簡単に操作できるので、専門家に確認すると思いました.ArrayList

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 に答える