Transferencia de archivos de Android usando sockets

He estado trabajando en un programa de Android. Una parte de este programa interactúa con un servicio web mediante una conexión de socket y envía archivos que, en promedio, tienen un tamaño aproximado de 320 kB. El código ejecutado en un escritorio tarda aproximadamente 1.5 minutos en transferirse. Usando mi teléfono Android (Atrix) parece estar tomando alrededor de una hora. El teléfono está conectado a wifi, así que no esperaba que tomara tanto tiempo. Mi idea inicial fue agregar un bloqueo wifi, pero no ha ayudado en nada.

Tengo la carga real ejecutándose en una tarea asíncrona (para leer, he hecho algo pseudo)

@Override
protected void onPreExecute() 
{
    //Before starting the task show the uploading dialog
    uploadingDialog.show();

}
@Override
protected void onPostExecute(final Boolean success) {
    //After the task close the dialog
    uploadingDialog.dismiss();
}
@Override
protected Boolean doInBackground(String... params) {
    //Upload the files in the background

    //keep track of upload results
    boolean uploaded = true;
    boolean temp;

    //lock wifi on and stop the program from sleeping
    _keepOnStart();

    //Upload each file individually
    for(int i=0; i <= fileNameList.size()-1; i++){
        //this method does the actual writing to the socket/converts
        //the file to a byte array etc.
        temp = serverConnection.uploadWord(fileNameList.get(i));
        if(temp == false) {
            uploaded = false;
        }
    }
    _keepOnStop();
    return uploaded;
}
private void _keepOnStart() {
    if (_powerManagement == null) {
        _powerManagement = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);
    }
    if (_wakeLock == null) {
        _wakeLock = _powerManagement.newWakeLock(   PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE,
                                                    "0 Backup power lock");
    }
        _wakeLock.acquire();
        WifiManager wifiManager = (WifiManager) ctx.getSystemService(Context.WIFI_SERVICE);
        if (wifiManager != null) {
            _wifiLock = wifiManager.createWifiLock("0 Backup wifi lock");
            _wifiLock.acquire();
        }
}

private void _keepOnStop() {
    if ((_wifiLock != null) && (_wifiLock.isHeld())) {
        _wifiLock.release();
    }
    if ((_wakeLock != null) && (_wakeLock.isHeld())) {
        _wakeLock.release();
    }
}

En la versión de escritorio del código, solo estaba cronometrando "serverConnection.uploadWord(fileNameList.get(i));" con un nombre de archivo establecido. El método en sí toma los datos de bytes del archivo, crea un paquete para enviar al servidor y luego lo envía.

Algunos de mis permisos manifiestos:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

Me pregunto si alguien puede proporcionar una explicación para esto. Mi suposición es que el dispositivo está usando su conexión de datos, pero al mismo tiempo solo se permiten datos de fondo en el dispositivo y no veo uso de datos en los últimos 7 días.

(Cualquier y toda ayuda es muy apreciada. Si no tengo claro de todos modos, hágamelo saber).

preguntado el 12 de junio de 12 a las 16:06

¿Ves el icono de wifi en la barra de estado o el de la red móvil? Si tiene acceso a los registros del servidor, verifique la dirección IP; suponiendo que su wifi involucra NAT, el teléfono en wifi debería aparecer en el servidor con la misma dirección IP que una PC en su wifi que accede al servidor en el mismo momento. . -

En la barra de estado, se muestran wifi y H+. La base de datos no almacena la dirección IP de los dispositivos. Desafortunadamente, los registros escritos por el servicio web no funcionan. (o no se han actualizado...) Tengo acceso a /var/logs/messages, aunque algo allí podría ayudar. Verificar si tienen la misma dirección IP es una excelente manera de saber si el teléfono está usando wifi o datos. Sugerencia sólida. -

Al revisar los registros de mensajes, no veo nada allí. ¿Alguna otra idea? o estoy buscando en el registro equivocado? -

Estoy un poco sorprendido de que tengas ambos íconos a la vez. Puede intentar ingresar a uno de esos sitios web que muestran su IP desde el navegador en el dispositivo y desde la PC. -

El escritorio que uso tiene ip: 131.202.xxx.xxx - La ip del teléfono se muestra como: 131.202.xxx.xxx -

1 Respuestas

Para cualquiera que esté mirando lo mismo. Parece que este es el enfoque correcto. La inmensa cantidad de tiempo fue un derivado de un esquema de codificación muy ineficiente que se realizó antes de enviar los datos. (No escala bien)

Respondido el 14 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.