使用套接字进行Android文件传输

时间:2012-06-12 15:13:50

标签: android sockets android-wifi android-internet

我一直在研究一个Android程序。该程序的一部分使用套接字连接与Web服务交互,发送平均大约为320 kB的文件。在桌面上运行的代码大约需要1.5分钟才能完成传输。使用我的Android手机(Atrix)似乎需要大约一个小时。手机连接到wifi,所以我没想到它花了这么长时间。我最初的想法是添加一个wifi锁,但它没有任何帮助。

我在异步任务中运行了实际的上传(为了阅读我已经使其中的一些伪)

@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();
    }
}

在桌面版本的代码中,我只是计时“serverConnection.uploadWord(fileNameList.get(i));”使用设置的文件名。 该方法本身从文件中获取字节数据,创建一个数据包发送到服务器然后将其发送出去。

我的一些明显权限:

<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" />

我想知道是否有人可以为此提供解释。我的假设是设备正在使用它的数据连接,但同时只允许设备上的后台数据,并且我发现在过去7天内没有数据使用。

(非常感谢任何和所有帮助。如果我不清楚请告诉我。)

1 个答案:

答案 0 :(得分:0)

对于任何看同样事物的人。这似乎是正确的方法。大量的时间是在发送数据之前完成的非常低效的编码方案的衍生物。 (它没有很好地扩展)