[英]Android activity produces black screen because of the content
我有2个活动。
ActivityA通过单击按钮来启动activityB。
单击该按钮后,我将创建一个新对话框,并将图像显示为一种缩减的加载屏幕(不受进度条的干扰)。
当activityB启动时,来自ActivityA的对话框被杀死,我立即在oncreate的顶部启动一个新对话框。 我对activityB的oncreate做了很多事情。
创建一个adview,为主视图添加一些文本,并创建GLsurface渲染器。
问题是,当调用activityB的oncreate时,我在两个对话框之间出现了4秒的黑屏。 我想尽量减少这种情况。
因此,是否有必要使活动B中的对话框立即运行,而不是等待onCreate的其余部分完成其工作。 如果需要将提供代码
UPDATE。 正是我的glsurface渲染器的创建导致了黑屏这么长时间。 这是活动B代码
public class ActivityB extends BaseGameActivity
{
/** Hold a reference to our GLSurfaceView */
private MyGLSurfaceView mGLSurfaceView;
public GamePlay GamePlay;
public GoogleApiClient mGoogleApiClient = null;
private AdView adView;
private static final String AD_UNIT_ID = "******************************";
private Button RotateButton;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// load screen dialog
Dialog loader_dialog = new Dialog(this,android.R.style.Theme_Black_NoTitleBar_Fullscreen);
loader_dialog.setContentView(R.layout.loading_screen);
loader_dialog.show();
// Create an ad.
adView = new AdView(this);
adView.setAdSize(AdSize.SMART_BANNER);
adView.setAdUnitId(AD_UNIT_ID);
// Add the AdView to the view hierarchy. The view will have no size
// until the ad is loaded.
RelativeLayout layout = new RelativeLayout(this);
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
// Create an ad request. Check logcat output for the hashed device ID to
// get test ads on a physical device.
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice("*****************************").build();
// Start loading the ad in the background.
adView.loadAd(adRequest);
final TextView Score = new TextView(this);
Score.setText(" 0");
RelativeLayout.LayoutParams scoreParams = new
RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
Score.setLayoutParams(scoreParams);
Typeface tf = Typeface.createFromAsset(getAssets(),"Fonts/test.ttf");
Score.setTextSize(getResources().getDimension(R.dimen.textsize));
Score.setTypeface(tf);
Score.setTextColor(Color.parseColor("#FDAA03"));
LayoutInflater inflater = (LayoutInflater) this.getSystemService(this.LAYOUT_INFLATER_SERVICE);
View userInterface = inflater.inflate(R.layout.user_interface, null);
GameButton = (Button) userInterface.findViewById(R.id.gamebutton);
GameButton.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
//irrelivant game stuff
}
});
// Check if the system supports OpenGL ES 2.0.
final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;
if (supportsEs2)
{
// Request an OpenGL ES 2.0 compatible context.
mGLSurfaceView = new MyGLSurfaceView(this); new GLSurfaceView(this);
mGLSurfaceView.setEGLContextClientVersion(2);
final DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
// Set the renderer to our demo renderer, defined below.
mGoogleApiClient = getApiClient();
RelativeLayout.LayoutParams adParams =
new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
adParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
adParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layout.addView(mGLSurfaceView);
layout.addView(userInterface);
layout.addView(Score);
layout.addView(adView, adParams);
mGLSurfaceView.setRenderer(new MyRenderer(this, Score, mGoogleApiClient),displayMetrics);
//Set main renderer
setContentView(layout);
}
else
{
// This is where you could create an OpenGL ES 1.x compatible
// renderer if you wanted to support both ES 1 and ES 2.
return;
}
}
@Override
protected void onResume()
{
// The activity must call the GL surface view's onResume() on activity onResume().
super.onResume();
mGLSurfaceView.onResume();
}
@Override
protected void onPause()
{
// The activity must call the GL surface view's onPause() on activity onPause().
super.onPause();
mGLSurfaceView.onPause();
}
}
您可以为此使用AsyncTask
。
仅在onCreate
内准备UI元素(获取所需视图的引用,显示对话框),然后将所有繁重的任务移至AsyncTask
,然后在onPostExecute
从那里更新UI(关闭对话框,填充视图,...)。加载完成。 如果需要,您甚至可以使用AsyncTask
来显示加载进度;)
您可以使用
public static Dialog d;
在活动A中。在活动中显示移至活动B,然后成功完成所有操作,您可以从活动B中取消该对话框。
if(A.d.isshowing()){
A.d.dismiss();
}
希望这能解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.