我正在尝试按照以下规则创建一个具有横幅和取消按钮的启动页面:
- 如果没有按下任何按钮,5 秒后转到主要活动。
- 如果按下取消按钮,则立即转到主要活动。
- 如果横幅被按下,则转到其他活动。
My code:
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);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)