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

时间:2014-06-24 16:48:09

标签: java android

我正在尝试等待后台进程完成,然后在完成后相应地做一些事情。

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

我的目标是按下mSignin按钮时,我会拨打CheckInternetConnection。这应该更新我的布尔值hasInternet。因此,我希望做一些事情。

但我想要在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;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

有很多方法可以等待AsyncTask完成,但我认为你不想这样做,因为它会阻止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;
        }
    }
}

答案 1 :(得分:0)

异步任务的目的是处理一个不会阻止主线程的昂贵过程。如果这是一个快速的步骤,不要把它作为一个单独的任务,只需在那时做到。

答案 2 :(得分:0)

一种方法是:

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();



      }
    });
  }
}