2012-06-12 46 views
0

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

我有一个异步任务运行的实际上传(对于阅读中,我做了它的一些伪)

@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获得(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天内我看不到任何数据。

(任何及所有的帮助深表感谢。如果我不清楚反正请让我知道。)

+0

你是否在状态栏或移动网络中看到了无线网络图标?如果您有权访问服务器日志,请检查IP地址 - 假设您的WiFi涉及NAT,则无线网络上的手机应显示在服务器上,使其具有与您的无线网络在相同时间点访问服务器上的PC相同的IP地址。 –

+0

在状态栏中,我同时显示了wifi和H +。数据库不存储设备的IP地址。不幸的是,由web服务写入的日志不起作用。 (或者没有得到更新...)我可以访问/ var/logs/messages,尽管这里可能有帮助。 检查是否有相同的IP地址是了解手机是否使用wifi或数据的好方法。坚实的建议。 – sherwood

+0

查看消息日志,我没有看到任何内容。任何其他想法?或者我在看错日志? – sherwood

回答

0

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