![](/img/trans.png)
[英]How to wait for a thread to finish before another thread starts in Java/Android?
[英]Java Wait for thread(in another class) to finish before executing code in activity
在我的Android应用程序中,我试图创建一种类似于ios委托功能的情况。
(在ios->中),其中将调用执行检查的类,并在完成检查后使用委托将其重定向回viewcontroller并执行下一个功能。
这是我的课
public class Checking{
private boolean flag;
public boolean getFlag(){
return flag;
}
public void checkFunction(){
//..... check database
if(need to do call webservice){
Thread thread = new Thread(){
@Override
public void run(){
// Perform webservice calling
}
};
thread.start();
}
else{
//end
}
}
}
这是我的活动
public class ActivityA extends Activity{
@Override
public void onResume(){
doChecking();
}
public void doChecking(){
Checking check = new Checking();
check.checkFunction();
// should finish preform checking in Checking class before proceed
if(check.getFlag()){
// perform next function
}
else{
// show alert
}
}
}
问题是,在调用Checking类之后,它立即在函数调用下面立即执行if if else。 在某些情况下,“检查”类中的检查尚未完成,并且显示为空警报。 线程是否启动取决于数据库检查。
有人可以为我提供解决方案吗? 我知道在调用Checking类后缺少了一些东西,但我不太确定将其放置在什么地方才能获得结果。
提前致谢。
您基本上想要做的是单击Web服务,然后等待直到获得Web服务的响应。
首先,您不需要创建自己的Thread
Web服务。 相反,您可以使用AsyncTask
通过AsyncTask,可以正确,轻松地使用UI线程。 此类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。
下面是AsyncTask
代码
class MyAsync extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
//Hit your web service here
}
@Override
protected void onPostExecute(final Void unused) {
//Process the result here
}
}
如果要限制用户访问Web服务之前访问应用程序。 您可以通过其他方法显示对话框,如下所示:
class MyAsync extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
loadingDialog.setMessage("Please wait...");
loadingDialog.setCancelable(false);
loadingDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
//Hit your web service here
}
@Override
protected void onPostExecute(final Void unused) {
if (loadingDialog.isShowing()) {
loadingDialog.dismiss();
}
//Process the result here
}
}
可以通过以下方式来实现它:将活动传递给Checking类的构造函数,并使用它来调用ActivityA类中的showAlert()函数。
public class Checking{
Activity activity_;
public Checking(Activity activity){
this.activity_ = activity;
}
private boolean flag;
public boolean getFlag(){
return flag;
}
public void checkFunction(){
//..... check database
if(need to do call webservice){
Thread thread = new Thread(){
@Override
public void run(){
// Perform webservice calling
//after all the process
Handler handler = new Handler();
handler.post(new Runnable{
@Override
public void run(){
(MyActivity) activity_.showAlert();
}});
}
};
thread.start();
}
else{
//end
}
}
}
public class ActivityA extends Activity{
@Override
public void onResume(){
doChecking();
}
public void doChecking(){
Checking check = new Checking(ActivityA.this);
check.checkFunction();
}
public void showAlert(){
// should finish preform checking in Checking class before proceed
if(check.getFlag()){
// perform next function
}else{
// show alert
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.