1

我的应用程序有一个功能,当在菜单中选择一个选项时,它会向 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会以某种方式受到电话的影响吗?

将其迁移到服务组件中的线程会有所不同吗?

4

1 回答 1

2

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

你可以让它运行,如果数据量很小,它很可能会成功上传。如果它更大,服务会给你更好的机会完成上传,但它也可能会被重述,所以你应该妥善处理。您还可以侦听连接更改(使用广播侦听器),并在网络可用时自动重试上传。

于 2012-02-08T03:01:12.800 回答