Java 如何在android中等待后台进程完成

Java 如何在android中等待后台进程完成,java,android,Java,Android,我试图等待后台进程完成,然后在它完成后做一些相应的事情 基本上我有一个类TwitterActivity和一个内部类CheckInternetConnection,它扩展了AsyncTask。我还有一个按钮mSignin,我为它设置了事件处理。此外,我还有一个布尔值hasInternet 我的目标是当按下mSignin按钮时,我将调用CheckInternetConnection。这将更新我的布尔值hasneet。因此,我希望做一些事情 但我想在onClick()方法内部执行 有没有办法实现这一目

我试图等待后台进程完成,然后在它完成后做一些相应的事情

基本上我有一个类
TwitterActivity
和一个内部类
CheckInternetConnection
,它扩展了
AsyncTask
。我还有一个按钮
mSignin
,我为它设置了事件处理。此外,我还有一个布尔值
hasInternet

我的目标是当按下
mSignin
按钮时,我将调用
CheckInternetConnection
。这将更新我的布尔值
hasneet
。因此,我希望做一些事情

但我想在
onClick()方法内部执行

有没有办法实现这一目标?谢谢

public class TwitterActivity extends Activity 
{
    private boolean hasInternet = false;
    private Button mSignin;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_twitter);

        mSignin = (Button)findViewById(R.id.login_id);
        mSignin.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                new CheckInternetConnection().execute();

                if(hasInternet)
                    //do some stuff
                else
                    //do some other stuff
            }
        });
    } 

    class CheckInternetConnection extends AsyncTask<Void, Void, Boolean>{
        @Override
        protected void onPostExecute(Boolean result){
            if(result)
                hasInternet = true;
            else
                hasInternet = false;
        }
        @Override
        protected Boolean doInBackground(Void... params) {
            return true;
        }
    }
}
公共类TwitterActivity扩展活动
{
私有布尔值=false;
专用按钮mSignin;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_twitter);
mSignin=(按钮)findViewById(R.id.login\u id);
mSignin.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
新建CheckInternetConnection().execute();
国际单项体育联合会(互联网)
//做点什么
其他的
//做些别的事情
}
});
} 
类CheckInternetConnection扩展了异步任务{
@凌驾
受保护的void onPostExecute(布尔结果){
如果(结果)
hasInternet=正确;
其他的
hasInternet=错误;
}
@凌驾
受保护的布尔doInBackground(Void…params){
返回true;
}
}
}

异步任务的目的是处理不会阻塞主线程的昂贵过程。如果这是一个快速的步骤,不要将其作为一个单独的任务,只需立即执行即可。

有多种方法可以等待
异步任务完成,但我认为您不想这样做,因为它会阻塞UI线程。相反,将该检查移动到
onPostExecute
。您还可以在单击按钮时检查连接

public class TwitterActivity extends Activity 
{
    private boolean hasInternet = false;
    private Button mSignin;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_twitter);

        mSignin = (Button)findViewById(R.id.login_id);
        mSignin.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                checkInternet();
            }
        });
    } 

    private void checkInternet(){
        if(hasInternet)
            //do some stuff
        else
            new CheckInternetConnection().execute();
    }

    class CheckInternetConnection extends AsyncTask<Void, Void, Boolean>{
        @Override
        protected void onPostExecute(Boolean result){
            if(result)
                hasInternet = true;
            else
                hasInternet = false;

            checkInternet();
        }
        @Override
        protected Boolean doInBackground(Void... params) {
            return true;
        }
    }
}
公共类TwitterActivity扩展活动
{
私有布尔值=false;
专用按钮mSignin;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_twitter);
mSignin=(按钮)findViewById(R.id.login\u id);
mSignin.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
检查互联网();
}
});
} 
私人互联网(){
国际单项体育联合会(互联网)
//做点什么
其他的
新建CheckInternetConnection().execute();
}
类CheckInternetConnection扩展了异步任务{
@凌驾
受保护的void onPostExecute(布尔结果){
如果(结果)
hasInternet=正确;
其他的
hasInternet=错误;
检查互联网();
}
@凌驾
受保护的布尔doInBackground(Void…params){
返回true;
}
}
}

一种方法是:

public class TwitterActivity extends Activity {

  private boolean hasInternet = false;
  private Button mSignin;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_twitter);

    mSignin = (Button)findViewById(R.id.login_id);
    mSignin.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {



        new AsyncTask<Void, Void, Boolean>() {

          @Override
          protected Boolean doInBackground(Void... params) {
              // TODO: put your async job here
              return true;
          }

          @Override
          protected void onPostExecute(Boolean result){
            hasInternet = result;

            if( hasInternet ) {
              // do some stuff
              // 
            } else {
              // do some other stuff
            }

          }
        }.execute();



      }
    });
  }
}
公共类TwitterActivity扩展活动{
私有布尔值=false;
专用按钮mSignin;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_twitter);
mSignin=(按钮)findViewById(R.id.login\u id);
mSignin.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
新建异步任务(){
@凌驾
受保护的布尔doInBackground(Void…params){
//TODO:将异步作业放在此处
返回true;
}
@凌驾
受保护的void onPostExecute(布尔结果){
hasInternet=结果;
国际单项体育联合会(互联网){
//做点什么
// 
}否则{
//做些别的事情
}
}
}.execute();
}
});
}
}

我知道这是有道理的,但是
CheckInternetConnection
必须在异步任务中运行,因为否则它会给我一些错误。如果没有internet连接,您认为它可能进入无限循环吗?是的,所以您需要在那里进行某种检查。您可以尝试3次,然后显示错误。