繁体   English   中英

Android活动由于内容而产生黑屏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM