Android可取消启动画面

标签 android android-asynctask splash-screen

我正在尝试根据以下规则创建一个带有横幅和取消按钮的启动页面:

  1. 如果没有按下任何按钮,5 秒后转到主要 Activity 。
  2. 如果按下取消按钮,立即转到主要 Activity 。
  3. 如果按下横幅,则转到其他 Activity 。

我的代码:

public class BannerSplashActivity extends Activity {
    private static final int TIMEOUT = 5000;

    private View mButtonCancel;
    private SplashHolderTask mSplashHolderTask;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.form_banner_splash);

        // Excecute task
        mSplashHolderTask = new SplashHolderTask();
        mSplashHolderTask.execute();

        // find references
        mButtonCancel = findViewById(R.id.buttonCancel);
        mButtonCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mSplashHolderTask.cancel(true);
                goToMainActivity();
            }
        });
    }

    private void goToMainActivity(){
        startActivity(new Intent(this, MainActivity.class));
        finish();
    }


    /**
     * This task holds the bannerSplash
     */
    private class SplashHolderTask extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... params) {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    goToMainActivity();
                }
            }, TIMEOUT);

            return null;
        }
    }
}

当我运行我的代码时,我得到:

Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

我如何实现该逻辑?

最佳答案

您不能在 AsyncTask 中创建线程。您可以简单地使用一个简单的延迟处理程序,如果单击横幅、取消按钮或用户离开应用程序,您将取消该处理程序:

public class BannerSplashActivity extends Activity {
    private static final int TIMEOUT = 5000;

    private Handler cancelHandler;

    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.form_banner_splash);

      cancelHandler = new Handler(){
        @Override
        public void dispatchMessage(Message msg) {
             goToMainActivity();
        }
      };
      cancelHandler.sendEmptyMessageDelayed(0, TIMEOUT);

      // find references
      View mButtonCancel = findViewById(R.id.buttonCancel);
      View mBannerView = findViewById(R.id.bannerView);

      mButtonCancel.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              cancelHandler.removeMessages(0);
              goToMainActivity();
          }
      });

      mBannerView.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              cancelHandler.removeMessages(0);
              //go to the activity you want
          }
      });
 }

  private void goToMainActivity(){
      startActivity(new Intent(this, MainActivity.class));
      finish();
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    if(cancelHandler != null){
      cancelHandler.removeMessages(0);
    }
  }
}    

关于Android可取消启动画面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21989199/

相关文章:

android - 在 Activity 中处理 AsyncTask.doInBackground 中的异常?

java - 启动画面不会显示,只有空白区域

java - 在启动画面 Android 上包含文本

android - 改造中RxJava2CallAdapterFactory.create()的作用是什么

java - 在 GridView Android 中查找元素时需要帮助

java - 从我的异步线程调用 Activity 类中的方法

android - 在 Capacitor Ionic/Ionic React 中隐藏 Android 启动画面

java - Android:读取pdf文件

java - Proguard android找不到引用的类

android - Base64 图像的 Recyclerview - 滚动缓慢且滞后