0
    package com.simonguest.btxfr;

import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;

class DataTransferThread extends Thread {
private final String TAG = "android-btxfr/DataTransferThread";
private final BluetoothSocket socket;
private Handler handler;

public DataTransferThread(BluetoothSocket socket, Handler handler) {
    this.socket = socket;
    this.handler = handler;
}

public void run() {
    try {
        InputStream inputStream = socket.getInputStream();
        boolean waitingForHeader = true;
        ByteArrayOutputStream dataOutputStream = new ByteArrayOutputStream();
        byte[] headerBytes = new byte[22];
        byte[] digest = new byte[16];
        int headerIndex = 0;
        ProgressData progressData = new ProgressData();

        while (true) {
            if (waitingForHeader) {
                byte[] header = new byte[1];
                inputStream.read(header, 0, 1);
                Log.v(TAG, "Received Header Byte: " + header[0]);
                headerBytes[headerIndex++] = header[0];

                if (headerIndex == 22) {
                    if ((headerBytes[0] == Constants.HEADER_MSB) && (headerBytes[1] == Constants.HEADER_LSB)) {
                        Log.v(TAG, "Header Received.  Now obtaining length");
                        byte[] dataSizeBuffer = Arrays.copyOfRange(headerBytes, 2, 6);
                        progressData.totalSize = Utils.byteArrayToInt(dataSizeBuffer);
                        progressData.remainingSize = progressData.totalSize;
                        Log.v(TAG, "Data size: " + progressData.totalSize);
                        digest = Arrays.copyOfRange(headerBytes, 6, 22);
                        waitingForHeader = false;
                        sendProgress(progressData);
                    } else {
                        Log.e(TAG, "Did not receive correct header.  Closing socket");
                        socket.close();
                        handler.sendEmptyMessage(MessageType.INVALID_HEADER);
                        break;
                    }
                }

            } else {
                // Read the data from the stream in chunks
                byte[] buffer = new byte[Constants.CHUNK_SIZE];////////bfsize
                Log.v(TAG, "Waiting for data.  Expecting " + progressData.remainingSize         + " more bytes.");
                int bytesRead = inputStream.read(buffer);
                Log.v(TAG, "Read " + bytesRead + " bytes into buffer");
                dataOutputStream.write(buffer, 0, bytesRead);
                progressData.remainingSize -= bytesRead;
                sendProgress(progressData);

                if (progressData.remainingSize <= 0) {
                    Log.v(TAG, "Expected data has been received.");
                    break;
                }
                //System.gc();///////
            }
        }

        // check the integrity of the data
        final byte[] data = dataOutputStream.toByteArray();

        if (Utils.digestMatch(data, digest)) {
            Log.v(TAG, "Digest matches OK.");
            Message message = new Message();
            message.obj = data;
            message.what = MessageType.DATA_RECEIVED;
            handler.sendMessage(message);




            // Send the digest back to the client as a confirmation
            Log.v(TAG, "Sending back digest for confirmation");
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(digest);

        } else {
            Log.e(TAG, "Digest did not match.  Corrupt transfer?");
            handler.sendEmptyMessage(MessageType.DIGEST_DID_NOT_MATCH);
        }

        Log.v(TAG, "Closing server socket");
        socket.close();

    } catch (Exception ex) {
        Log.d(TAG, ex.toString());
    }
}

private void sendProgress(ProgressData progressData) {
    Message message = new Message();
    message.obj = progressData;
    message.what = MessageType.DATA_PROGRESS_UPDATE;
    handler.sendMessage(message);
}
}

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

从下面的代码中,当我通过蓝牙接收到大约 27 MB 的大文件时,我在进度超过 50% 时崩溃了。谁能建议我为什么以及如何解决它?谢谢大家。

4

0 回答 0