Java在执行活动中的代码之前等待线程(在另一个类中)完成

时间:2015-09-03 09:22:42

标签: java android multithreading

在我的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 else。在某些情况下,检查类中的检查尚未完成,并显示空警报。根据数据库检查,线程可能启动也可能不启动。

有人能为我提供解决方案吗? 我知道在调用Checking类之后缺少了一些东西但是我不太确定要把它放在那里以便达到结果。

提前致谢。

2 个答案:

答案 0 :(得分:0)

您基本上想要做的是点击网络服务,然后等到您收到网络服务的响应。

首先,您无需创建自己的AsyncTask点击网络服务。相反,您可以使用AsyncTask

  

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

以下是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 } }

的代码
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
    }

}

如果您想限制用户访问应用,直到网络服务被点击。您可以从其他方法显示对话框,如下所示:

 {
  "xmllisting_id": "537f371fb2e380922fff0e2c",
  "pharmacyfiles_id": "537f3402b2e380732aa6032d",
  "claim": {
    "MemberID": "097110330047532601",
    "PatientShare": "0",
  },
  "modified": ISODate("2014-05-23T13:12:17.191Z"),
  "created": ISODate("2014-05-23T13:12:17.192Z")
}

答案 1 :(得分:0)

可以通过以下方式实现:通过在Checking类的construtor中传递活动并使用它来调用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
   }
}
}