1

私のアプリケーションには、メニューでオプションが選択されたときにWebサービスにデータを送信する機能があります。これを行うために、アイテムが選択されるとAsyncTaskを実行するアクティビティがあります。

これは、デモンストレーションの目的で複雑さを軽減するために簡略化されたサンプルコードです。sendDataToWebService()メソッドは、選択イベントで呼び出されます。

private void sendDataToWebService(MyData myData)
{
    MyAsyncTask task = new MyAsyncTask();
    task.execute(myData);
}


private class MyAsyncTask extends AsyncTask<MyData, Integer, String>
{
    @Override
    protected String doInBackground(MyData... myDataObjects)
    {
        // code here calls the data access layer, passing my data to it.
        // The data access layer basically does this (simplyfied for this example):
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httpPostRequest = new HttpPost(uri);
        response = httpclient.execute(httpPostRequest);
        //... clean up and return response back to doInBackground()...

        return someStringText;
    }

    @Override
    protected void onPostExecute(String value)
    {
        // Do something related to the value parameter
    }
}

ユーザーがWebサービスへのデータの送信を開始した後、送信中に着信電話を受信する状況を説明しようとしています。着信イベントが発生すると、アクティビティのonPauseメソッドが呼び出されますが、送信がAsyncTaskで行われているため、onPauseが完了した後もAsyncTaskスレッドは続行されます。

だから私はこの状況に対処するための最良の方法は何だろうかと思っていますか?AsyncTaskを実行し続けますか?着信イベントをリッスンして、AsyncTaskをキャンセルしようとしますか?

送信に使用されている無線(WiFiまたはセルネットワーク)はこれにどのように影響しますか?一部の通信事業者(Verizonなど)は、電話での会話中に携帯電話ネットワークを介したデータ送信を許可していないと思います。WiFiはどういうわけか電話の影響を受けますか?

これをサービスコンポーネント内のスレッドに移行すると、違いが生じますか?

4

1 に答える 1

2

いつものように、それは異なります。データはどのくらい重要ですか?どのくらいの大きさですか?送信が中断された場合、再試行できますか?電話は特別な場合ではありません。アクティビティはいつでもバックグラウンドで実行される可能性があり(ユーザーがホームボタンを押すなど)、これはモバイルデバイスであるため、いつでも接続が失われる可能性があります(電車がトンネルに入るなど)。

実行させるだけで、データサイズが小さい場合は、正常にアップロードされる可能性があります。それが大きい場合、サービスはアップロードを完了する可能性が高くなりますが、それも言い換えられる可能性があるため、これを適切に処理する必要があります。接続の変更をリッスンし(ブロードキャストリスナーを使用)、ネットワークが利用可能になったときにアップロードを自動的に再試行することもできます。

于 2012-02-08T03:01:12.800 に答える