当存在网络连接时,我当前已成功将数据提交到数据库。我的应用程序是一个可以在户外使用的应用程序,经常在某些地方使用的服务非常差。
我的问题是,在存在活动网络连接之前,延迟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);
}
答案 0 :(得分:2)
如果在连接可用时没有连接警报,我是否应该创建一个运行的服务?
是。使用IntentService
处理所有网络请求。当Activity
想要上传/下载任何内容时,它会将其请求传递给IntentService
。如果没有网络连接,请求将排队,IntentService
将自行终止。
同时创建在mainifest中注册的BroadcastReceiver
,用于“侦听”网络连接更改。如果更改为“已连接”状态,则应启动IntentService
处理任何排队的网络请求并再次自行终止。
效率很高,并且在我的经验中运作良好。