0

私はアンドロイドプログラムに取り組んできました。このプログラムの一部は、ソケット接続を使用して Web サービスと対話し、平均で約 320 kB のファイルを送信します。デスクトップで実行されたコードは、転送に約 1.5 分かかります。Androidフォン(Atrix)を使用すると、約1時間かかるようです。Wi-Fiにつながっているので、こんなに時間がかかるとは思っていませんでした。私の最初の考えは、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 日間にデータが使用されていません。

(どんな助けでも大歓迎です。とにかく不明な点がある場合はお知らせください。)

4

1 に答える 1

0

同じものを見ている人のために。これが正しいアプローチのようです。膨大な時間は、データを送信する前に行われた非常に非効率的なエンコード スキームの派生物でした。(上手く伸びなかった)

于 2012-06-14T17:29:11.383 に答える