1

我遇到了一个奇怪的问题......我的应用程序是为了在一个单独的线程上做一些 web 服务调用。一旦网络服务调用完成,它会将用户导航到不同的活动。在用户按下主页按钮或退出当前活动的情况下,如果 web 服务调用线程仍在运行,它应该终止 web 服务。因此,我将线程终止方法置于 OnPause 状态。

这是在线程内运行的方法块:

private Thread _webserviceThread;

void WebserviceCallThread(){
    WebRestult result= WebserviceCall();
    if(!result.containsError()){
         RunOnUIThread(delegate{
             transitionToActivityXYZ();
         });
    }
}

void RunThreadAction(){
    _webserviceThread = new Thread(new ThreadStart(WebserviceCallThread));
    _webserviceThread.Start();
}


protected override void OnPause(){
    if(_webserviceThread != null && _webserviceThread.IsAlive){
        _webserviceThread.Abort();
    }

}

在 web 服务调用完成并开始转换到另一个页面后,它进入 OnPause 状态。然而,在一些奇怪的情况下,它会认为线程没有在 OnPause 状态下完成,即使活动转换是方法的最后一行。

有没有人遇到过这个问题?如果是这样,你是如何解决这个问题的?

谢谢!

4

2 回答 2

1

为什么不使用 Task Parallel Library,它是标准的 .NET,并且使用 AsyncTask,只推荐用于耗时少于几秒的任务。见文档

AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 提供的各种 API

下面是如何使用任务并行库的示例,取自此处

private void loginWithTaskLibrary()
{
    _progressDialog.Show();

    Task.Factory
        .StartNew(() =>
            _loginService.Login("greg")
        )
        .ContinueWith(task =>
            RunOnUiThread(() =>
                onSuccessfulLogin()
            )
        );
}
于 2013-02-17T22:37:39.923 回答
1

我总是用AsyncTask这种东西。它不仅抽象出显式的线程处理并提供钩子来做你想做的一切;这也是一种很好的方式来表示unit of work可以从 other 中使用的a activities

这篇文章的一部分有一个简单的例子,但它没有使用非常方便的通用参数。

于 2013-02-13T18:09:50.720 回答