我遇到了一个奇怪的问题...... 我的应用程序是在一个单独的线程上进行一些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状态下完成。
以前有人遇到过这个问题吗?如果是这样,你是如何解决这个问题的?
谢谢!
答案 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()
)
);
}