【问题标题】:How to wait for a background process to finish in android [duplicate]如何在android中等待后台进程完成[重复]
【发布时间】:2014-06-24 16:48:08
【问题描述】:

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

基本上我有一个类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;
        }
    }
}

【问题讨论】:

    标签: java android


    【解决方案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;
            }
        }
    }
    

    【讨论】:

    • 你认为如果没有网络连接会进入无限循环吗?
    • 是的,它会的,所以你需要在那里进行某种检查。您可以尝试 3 次,然后显示错误。
    【解决方案2】:

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

    【讨论】:

    • 我知道这是有道理的,但CheckInternetConnection 必须在异步任务中运行,否则它会给我一些错误
    【解决方案3】:

    一种方法是:

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

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 2018-01-12
      • 2011-04-24
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多