首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序开放时的黑色屏幕

应用程序开放时的黑色屏幕
EN

Stack Overflow用户
提问于 2011-07-08 22:28:25
回答 2查看 2K关注 0票数 4

每当我打开我的应用程序时,我都会看到这个黑色的屏幕,唯一摆脱它的方法就是按后退按钮,然后再转到应用程序。我的朋友告诉我,这件事将陷入僵局!但是我不认为,因为当我检查logcat时,它显示了下面的日志消息。

视图

代码语言:javascript
复制
private boolean mGameIsRunning;

public void surfaceCreated(SurfaceHolder holder) {
    // Your own start method.
    start();

}

public void start() {
    if (!mGameIsRunning) {
        thread.initLevel();
        thread.setRunning(true);
        thread.start();   

        mGameIsRunning = true;
    } else {

        thread.onResume();

        thread.initLevel();
        thread.setRunning(true);
    }
}

public void surfaceDestroyed(SurfaceHolder holder) {
    Log.d(TAG, "Surface is being destroyed");

    // tell the thread to shut down and wait for it to finish
    // this is a clean shutdown
    boolean retry = true;
    thread.setRunning(false);       
    while (retry) {     
        try {
            thread.join();
            retry = false;  
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }           
    }
    Log.d(TAG, "Thread was shut down cleanly"); 
}

线程

代码语言:javascript
复制
private Object mPauseLock = new Object();  
    private boolean mPaused;
    @Override
    public void run() {
        Canvas canvas;
        Log.d(TAG, "Starting game loop");
        while (running) {
            canvas = null;
            // try locking the canvas for exclusive pixel editing
            // in the surface
            try {
                canvas = this.mSurfaceHolder.lockCanvas();
                synchronized (mSurfaceHolder) {
                    mStartTime = System.currentTimeMillis();
                    mElapsedTime = System.currentTimeMillis() - mStartTime;

                    this.updateGame();
                    this.onDraw(canvas);
                }

                synchronized(mPauseLock){
                    while (mPaused) {

                        try {
                            mPauseLock.wait();
                        } catch (InterruptedException e) {
                        }
                    }   

                }

            } finally {
                // in case of an exception the surface is not left in
                // an inconsistent state
                if (canvas != null) {
                    mSurfaceHolder.unlockCanvasAndPost(canvas);
                }
            }   // end finally          
        }       
    }
    public void onPause() {
        synchronized (mPauseLock) {
            mPaused = true;         
        }
    }

    public void onResume() {
        synchronized (mPauseLock) {
            mPaused = false;
            mPauseLock.notifyAll();
        }
    }

日志

代码语言:javascript
复制
07-08 17:24:41.735: DEBUG/Hitman(3221): View added
07-08 17:24:41.895: DEBUG/(3221): Enemies Spawed
07-08 17:24:41.934: DEBUG/(3221): Starting game loop
07-08 17:24:42.165: INFO/ActivityManager(66): Displayed activity com.android.hitmanassault/.Hitman: 1384 ms (total 1384 ms)
07-08 17:24:46.164: DEBUG/(3221): Enemies Spawed
07-08 17:24:48.914: INFO/ActivityManager(66): Start proc com.android.settings for broadcast com.android.settings/.widget.SettingsAppWidgetProvider: pid=3228 uid=1000 gids={3002, 3001, 3003}
07-08 17:24:48.914: INFO/ActivityManager(66): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/.Launcher }
07-08 17:24:48.924: DEBUG/PhoneWindow(3221): couldn't save which view has focus because the focused view com.android.hitmanassault.HitmanView@44d99528 has no id.
07-08 17:24:48.954: INFO/WindowManager(66): Setting rotation to 0, animFlags=0
07-08 17:24:49.014: INFO/ActivityManager(66): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=2/1/2 nav=3/1 orien=1 layout=34}
07-08 17:24:49.275: DEBUG/(3221): Surface is being destroyed
07-08 17:24:49.285: DEBUG/(3221): Thread was shut down cleanly
07-08 17:24:49.694: DEBUG/ddm-heap(3228): Got feature list request
07-08 17:24:49.754: WARN/IInputConnectionWrapper(3221): showStatusIcon on inactive InputConnection
07-08 17:24:51.315: DEBUG/dalvikvm(66): GC freed 2325 objects / 114696 bytes in 122ms
07-08 17:24:58.234: INFO/ActivityManager(66): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.hitmanassault/.HitmanTitle }
07-08 17:24:58.284: INFO/WindowManager(66): Setting rotation to 1, animFlags=0
07-08 17:24:58.354: INFO/ActivityManager(66): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=2/1/2 nav=3/1 orien=2 layout=34}
07-08 17:24:58.554: DEBUG/(3221): Enemies Spawed
07-08 17:24:58.945: WARN/IInputConnectionWrapper(144): showStatusIcon on inactive InputConnection
07-08 17:25:00.604: DEBUG/dalvikvm(66): GC freed 1403 objects / 71832 bytes in 103ms

活动类:

代码语言:javascript
复制
@Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.game_menu, menu);
        return true;
    }

@Override
public boolean onOptionsItemSelected(MenuItem item){

    switch(item.getItemId()){
    case R.id.menu_restart:
        startActivity(new Intent(this, Hitman.class));
        return true;
    case R.id.menu_scores:
        startActivity(new Intent(this, HitmanScores.class));
        return true;
    case R.id.menu_help:
        startActivity(new Intent(this, HitmanHelp.class));
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    setContentView(new CanvasSurfaceView(this));
    Log.d(TAG, "View added");   

}
EN

回答 2

Stack Overflow用户

发布于 2011-07-08 22:57:30

旋转显示是否会导致其刷新(在模拟器:CTRL+F12中)?如果是这样,那么您必须在您的活动中重写onResume(),并让它重新启动您设置的、可能没有被调用的任何内容。您可能只需要从活动view.invalidate() ()调用onResume()吗?你没有显示你的活动代码,所以我不确定。

在我看到的代码中,您应该使用this.postInvalidate() (与invalidate()相同,但来自不同的线程),而不是this.onDraw(canvas),并让它在UI线程中调用this.onDraw(),而不是在线程中调用this.onDraw()

票数 1
EN

Stack Overflow用户

发布于 2011-07-09 01:42:05

在哪里初始化线程?尝试在surfaceCreated( )中这样做,而不是使用surfaceView consturctor (我认为这就是您所做的)。

代码语言:javascript
复制
public void surfaceCreated(SurfaceHolder holder) { 

    // Restart draw thread
    Thread.State state = thread.getState();

    if(state == Thread.State.TERMINATED)
        thread = new MyThread(getHolder(), getContext());   
    thread.setRunning(true);
    thread.start();  

} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6631231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档