【问题标题】:Android: surfaceView can't resume activity from pause()Android:surfaceView 无法从 pause() 恢复活动
【发布时间】:2013-10-05 18:01:16
【问题描述】:

我在测试surfaceView,基本上app jsut改变了背景颜色。

应用程序启动没有问题,但是当我“暂停”活动并“恢复”它时,应用程序在“pause()”方法循环中被阻止。

这是我的代码:

import java.util.Random;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.util.Log;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SurfaceViewTest extends Activity {
    FastRenderView renderView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_surface_view_test);
        renderView= new FastRenderView(this);
        setContentView(renderView);
    }

    protected void onResume() {
        super.onResume();
        renderView.resume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        renderView.pause();
    }

    public class FastRenderView extends SurfaceView implements Runnable {
        Thread renderThread=null;
        SurfaceHolder holder;
        volatile boolean running=false;

        Random rand= new Random();                      //random number creator----

        public FastRenderView(Context context) {
            super(context);
            holder=getHolder();         //<<-check the this statement
        }
        public void resume() {
            Log.d("ZR", "in resume");
            running=true;
            renderThread=new Thread(this);
            renderThread.start();   //<<<--AVVIA IL THREAD
        }
        @Override
        public void run() {
            Log.d("ZR", "in running");
            while(running){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if(!holder.getSurface().isValid())
                    continue;
                Canvas canvas = holder.lockCanvas();
                canvas.drawRGB(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));
                holder.unlockCanvasAndPost(canvas);
            }
        }
        public void pause() {
            running = false;
            Log.d("ZR", "in pause");
            while(true){ //<<<<<<<<<<<<<<CHECKKKKKK
                try {
                    renderThread.join();
                    Log.d("ZR", "in pause end");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

【问题讨论】:

    标签: android surfaceview onpause


    【解决方案1】:

    没有中断的while(true) 循环将永远不会在方法pause() 中停止。我希望在成功加入渲染线程后返回类似的东西(等到它结束)

    使用 runningvolatile 声明 run() 中的 while 循环应该没问题。

    【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多