0

当有网络连接时,我目前拥有的代码成功地将数据提交到数据库。我的应用程序是一款可以在户外使用的应用程序,经常在手机服务很差的地方使用。

我的问题是在有活动网络连接之前延迟 HTTP Post 的最佳方法是什么?如果连接可用时没有警告连接,我应该创建一个运行的服务吗?传输的数据很小,大约一千字节,所以我可以让应用程序存储它,直到设备在线,然后提交数据。这看起来可行吗?

另一个更糟糕的选择是让应用程序存储数据并在每次启动时检查是否有任何数据仍在等待提交以及提交数据的活动连接。

我目前必须提交数据的代码如下。如果您对此有任何建议,也将非常受欢迎。

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

如果连接可用时没有警告连接,我应该创建一个运行的服务吗?

是的。使用 anIntentService来处理所有网络请求。当一个Activity想要上传/下载任何东西时,它会将其请求传递给IntentService. 如果没有网络连接,则请求排队并IntentService自行终止。

还要在 mainifest 中创建一个BroadcastReceiver注册的“侦听”网络连接更改。如果更改为“已连接”状态,它应该启动IntentService处理任何排队的网络请求并再次自行终止。

根据我的经验,它很有效并且效果很好。

于 2012-07-09T18:49:19.850 回答