

こんにちは

Activityで入力した比較的大切なデータをサーバを安全に送信知りたく質問をしました。  
Androidからデータを送信すると処理に3～5秒かかり、処理結果をJSONで返してくれるサーバがあります。

このサーバへデータを送信中に、ユーザがアプリが切り替えた場合http通信ってどうなっちゃうんでしょうか？  
ActivityでThreadを生成した場合、アプリが非表示になった時にThreadがKillされちゃうことはないのでしょうか

どうやらAndroidにはAsyncTaskやAsyncTaskLoaderというものがあるらしいのですが、どうすれば安全にデータをサーバへ送信出来るののか教えてください。


CC BY-SA 3.0
2016-11-01T14:16:15.527
30035
2016-11-03T04:40:34.990
2016-11-02T08:02:47.423
7572
8247
question
android
Androidからクラウドへ通信する際に、アプリ切り替え等によって通信が中断しないようにするには？


AsyncTaskは、バックグラウンド処理を実行し、UIスレッドに結果を発揮します：  
* `doInBackground`メソッドは、別のスレッドでデータをサーバを送信します  
* 結果は`onPostExecute`メソッドに送られ

かくして、あなたの`Activity`がKillされている場合、`onPostExecute`に入ることはありません:

[code]

    private class DownloadFilesTask extends AsyncTask < URL, Integer, Integer > {
    
        protected Integer doInBackground(URL...urls) {
            // これは、別のバックグラウンドスレッドで実行されています
            return 0;
        }
    
        protected void onPostExecute(Integer result) {
            // これは、UIスレッドで実行されています
        }
    }
    
[/code]

これは、長期タスクためにバックグラウンド`Service`を使用することをお勧めします（[バックグラウンド`Service`リンク](https://developer.android.com/training/run-
background-service/create-service.html)）。例えば：

_ IntentService :

[code]

    public class HttpService extends IntentService {
    
        public HttpService() {
            super("HttpService");
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
    
            // Intentからデータを取得します
            String params = intent.getStringExtra("fruit");
    
            // ここでデータを送信します
        }
    }
    
[/code]

_ AndroidManifest :

[code]

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
    
        .....
    
        <service
            android:name=".HttpService"
            android:exported="false"/>
    
    <application/>
    
[/code]

_ Activity :

[code]

        ...
        Intent mServiceIntent = new Intent(this, HttpService.class);
        mServiceIntent.putExtra("fruit", "apple");
        // Starts the IntentService
        startService(mServiceIntent);
        ...
    
[/code]

備考 :

`Service`または`AsyncTask`が中断されることはありませんと仮定しないでください。Androidがメモリを必要とする場合、スレッド（`AsyncTask`か`Service`)がKillされてかもしれません。

これに対処するには アプリの状態を保存します。アプリの再起動は、前の状態をチェックします：

[code]

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    
    boolean shouldSend = preferences.getBoolean("send", false);
    if (shouldSend) {
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("send", true);
        editor.apply();
        // ここでデータを送信します
    
        .....
    
        editor.putBoolean("send", false);
        editor.apply();
    }
    
[/code]


CC BY-SA 3.0
2016-11-03T04:40:34.990
30073
2016-11-03T04:40:34.990
17321
30035
answer