我的应用程序具有在菜单中选择选项时将某些数据发送到Web服务的功能。为此,我有一个Activity,在选择项目后执行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是否会受到电话的影响?
将此迁移到Service组件中的某个线程会有所不同吗?
答案 0 :(得分:2)
像往常一样,这取决于。数据有多重要?多大?如果传输中断,你可以重试吗?打电话不是特例。您的活动可能随时都有后台(用户按下主页按钮等),由于这是一个移动设备,您可以随时丢失连接(火车进入隧道等)。
您可以让它运行,如果数据量很小,则可能会成功上传。如果它更大,服务将为您提供更好的完成上传的机会,但它也可以重新进行,因此您应该正确处理。您还可以侦听连接更改(使用广播侦听器),并在网络可用时自动重试上载。