Android - 如何在网络数据操作期间处理来电

时间:2012-02-07 23:39:13

标签: android android-asynctask lifecycle android-lifecycle

我的应用程序具有在菜单中选择选项时将某些数据发送到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组件中的某个线程会有所不同吗?

1 个答案:

答案 0 :(得分:2)

像往常一样,这取决于。数据有多重要?多大?如果传输中断,你可以重试吗?打电话不是特例。您的活动可能随时都有后台(用户按下主页按钮等),由于这是一个移动设备,您可以随时丢失连接(火车进入隧道等)。

您可以让它运行,如果数据量很小,则可能会成功上传。如果它更大,服务将为您提供更好的完成上传的机会,但它也可以重新进行,因此您应该正确处理。您还可以侦听连接更改(使用广播侦听器),并在网络可用时自动重试上载。