0

私が現在持っているコードは、ネットワーク接続があるときにデータをデータベースに正常に送信します。私のアプリは屋外で使用されるもので、携帯電話サービスが非常に貧弱な場所で頻繁に使用されます。

私の質問は、アクティブなネットワーク接続が確立されるまで HTTP Post を遅らせる最善の方法は何でしょうか? 接続が利用可能になったときに警告される接続がない場合に実行されるサービスを作成する必要がありますか? 送信されるデータは約 1 キロバイトと小さいので、デバイスがオンラインになるまでアプリにデータを保存させてから、データを送信することができます。これは実行可能に見えますか?

もう1つの貧弱なオプションは、アプリにデータを保存させ、送信を待っているデータとそれを送信するためのアクティブな接続があるかどうかを起動するたびに確認することです。

現在、データを送信する必要があるコードは以下のとおりです。それについて何か提案があれば、それも大歓迎です。

String setPost(Context context)
{

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(context.getResources().getString(R.string.url)); 

    try
    {
        List<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>(22);

        nameValuePairs.add(new BasicNameValuePair("month", "7"));

        ... etc ...

        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpclient.execute(httppost);

        InputStream is = response.getEntity().getContent();
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayBuffer baf = new ByteArrayBuffer(20);

        int current = 0;

        while ((current = bis.read()) != -1)
        {
            baf.append((byte)current);
        }

        Toast.makeText(context, "thank you for submitting!", Toast.LENGTH_LONG).show();

        return new String(baf.toByteArray());

    }
    catch (ClientProtocolException e)
    {
        Log.e(this.toString(), "fail: " + e);
        Toast.makeText(context, "submission failed :(\n please report the error below to developer\n" + e.toString(), Toast.LENGTH_LONG).show();
        return ("fail: " + e);
    }
    catch (IOException e)
    {
        Log.e(this.toString(), "fail: " + e);
        Toast.makeText(context, "submission failed :(\n please report the error below to developer:\n" + e.toString(), Toast.LENGTH_LONG).show();
        return ("fail: " + e);
    }
4

1 に答える 1

2

接続が利用可能になったときに警告される接続がない場合に実行されるサービスを作成する必要がありますか?

はい。を使用して、IntentServiceすべてのネットワーク リクエストを処理します。Activityが何かをアップロード/ダウンロードする場合、その要求を に渡しIntentServiceます。ネットワーク接続がない場合、要求はキューに入れられ、 はIntentService終了します。

またBroadcastReceiver、ネットワーク接続の変更を「リッスン」するメインフェストに登録済みを作成します。変更が「接続済み」状態への変更である場合、IntentServiceキューに入れられたネットワーク要求を処理し、再び自己終了する を開始する必要があります。

それは効率的で、私の経験ではうまく機能します。

于 2012-07-09T18:49:19.850 に答える