Зависает readObject() в ObjectInputStream

234
14 апреля 2017, 20:23

Зависает на строчке msg = ois.readObject(); Причем иногда зависает, а иногда нет. В чём дело, кто подскажет?

import android.bluetooth.BluetoothSocket;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class CommunicatorImpl extends Thread implements Communicator {
    interface CommunicationListener {
        void onMessage(Object message);
    }
    private final BluetoothSocket socket;
    private final InputStream inputStream;
    private final OutputStream outputStream;
    private final CommunicationListener listener;
    private ObjectOutputStream oos;
    private  ObjectInputStream ois;
    public CommunicatorImpl(BluetoothSocket socket, CommunicationListener listener) {
        this.socket = socket;
        this.listener = listener;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) {
            Log.d("CommunicatorImpl", e.getLocalizedMessage());
        }
        inputStream = tmpIn;
        outputStream = tmpOut;
        try {
            oos = new ObjectOutputStream(new BufferedOutputStream(outputStream));
            oos.flush();
            ois = new ObjectInputStream(new BufferedInputStream(inputStream));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void startCommunication() {
        Log.d("CommunicatorImpl", "Run the communicator");
        while (true) {
            if (listener != null) {
                Object msg = null;
                try {
                    msg = ois.readObject();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(msg!=null) {
                    listener.onMessage(msg);
                }
            }
        }
    }
    public void write(Object message) {
//        Log.d("CommunicatorImpl", "Write " + message);
        try {
            oos.writeObject(message);
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void stopCommunication() {
        try {
            socket.close();
        } catch (IOException e) {
            Log.d("CommunicatorImpl", e.getLocalizedMessage());
        }
    }
}

package com.fannasankh.bluetoothmaze;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.util.Log;
import java.io.IOException;
import java.io.Serializable;
import java.util.UUID;
public class ClientThread extends Thread implements Serializable {
    private volatile Communicator communicator;
    private final BluetoothSocket socket;
    private BluetoothAdapter bluetoothAdapter;
    private final CommunicatorService communicatorService;
    public ClientThread(BluetoothDevice device, CommunicatorService communicatorService) {
        this.communicatorService = communicatorService;
        BluetoothSocket tmp = null;
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        try {
            tmp = device.createRfcommSocketToServiceRecord(UUID.fromString(BluetoothActivity.UUID));
        } catch (IOException e) {
            Log.d("ClientThread", e.getLocalizedMessage());
        }
        socket = tmp;
    }
    public synchronized Communicator getCommunicator() {
        return communicator;
    }
    public void run() {
        bluetoothAdapter.cancelDiscovery();
        try {
            Log.d("ClientThread", "About to connect");
            socket.connect();
            Log.d("ClientThread", "Connected");
            synchronized (this) {
                communicator = communicatorService.createCommunicatorThread(socket);
            }
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Log.d("ClientThread", "Start");
                    communicator.startCommunication();
                }
            }).start();
        } catch (IOException connectException) {
            try {
                socket.close();
            } catch (IOException closeException) {
                Log.d("ClientThread", closeException.getLocalizedMessage());
            }
        }
    }
    public void cancel() {
        if (communicator != null) communicator.stopCommunication();
    }
}
Answer 1

Метод readObject() блокирующий, то есть текущий поток исполнения заблокируется на этом методе, пока в сокет не придут данные. Зависает потому, что с другой стороны объект не отправляется по сокету в этот ois и читать нечего.

READ ALSO
Получение текста из текущего элемента.Android

Получение текста из текущего элемента.Android

Есть обработчик нажатия на элемент, посредством которого происходит переход на новое Activity

186
Модификация Java-байткода при компиляции

Модификация Java-байткода при компиляции

Какие есть способы изменения Java-байткода во время/после компиляции? Меня интересует возможность за счёт аннотаций модифицировать классы,...

217
проблема с AsyncTask и Thread

проблема с AsyncTask и Thread

Хотел загрузить файл на серверно с потоками проблемы

237
XStream сериализация объекта в XML

XStream сериализация объекта в XML

Есть объектУ него есть несколько объектов, которые содержат в себе переменные типа List<String>

201