Mono Android:在onPause()状态下终止线程

时间:2013-02-12 20:02:09

标签: android multithreading thread-safety xamarin.android

我遇到了一个奇怪的问题...... 我的应用程序是在一个单独的线程上进行一些webservice调用。完成Web服务调用后,它会将用户导航到其他活动。 在用户按下主页按钮或退出当前活动的情况下,如果webservice调用线程仍在运行,它应该终止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();
    }

}

完成webservice调用并开始转换到另一个页面后,它将进入OnPause状态。但是,在某些奇怪的情况下,即使活动转换是方法的最后一行,它也会认为线程未在OnPause状态下完成。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

我总是使用AsyncTask来做这件事。它不仅抽象远离显式线程处理并提供钩子来完成你想要的所有事情;它也是表示可以从其他unit of work使用的activities的好方法。

this中有一个简单的例子,但是它并没有使用非常方便的通用参数。

答案 1 :(得分:1)

为什么不使用任务并行库, 它是标准的.NET,对于AsyncTask,它仅建议用于少于几秒的任务。请参阅Documentation

  

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

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

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

    Task.Factory
        .StartNew(() =>
            _loginService.Login("greg")
        )
        .ContinueWith(task =>
            RunOnUiThread(() =>
                onSuccessfulLogin()
            )
        );
}