2012-11-09 25 views
20

Tôi mới sử dụng OpenGL-ES trên Android, vì vậy xin lỗi vì câu hỏi khó hiểu của tôi. Tôi đang xây dựng chương trình này cho Android v2.2 - SDK # 8. Máy tính bảng của tôi hỗ trợ tối đa Android v3.1OpenGLES trên Android - IllegalStateException: setRenderer đã được gọi cho trường hợp này

Tôi đang cố gắng thiết lập môi trường OpenGL-ES cho Android bằng cách làm theo hướng dẫn trên developer.android.com. Chương trình được biên dịch tốt, và nó được cho là để hiển thị một màn hình màu xanh đơn giản trên thiết bị. Tuy nhiên, khi tôi cố gắng chạy nó trên thiết bị Android của mình, tôi nhận được lỗi "IllegalStateException: setRenderer đã được gọi cho lỗi này".

Dưới đây là mã của tôi:

public class TA_SpaceActivity extends Activity 
{ 
    private MyGLSurfaceView myGLView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     myGLView = new MyGLSurfaceView(this); //NOTE: this is where the app crashed 
     setContentView(myGLView); 
    } 
} 

class MyGLSurfaceView extends GLSurfaceView 
{ 
    public MyGLSurfaceView(Context context) 
    { 
     super(context); 
     setRenderer (new MyRenderer()); 
     setEGLContextClientVersion(2); 
     setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
    } 
} 

class MyRenderer implements GLSurfaceView.Renderer 
{ 
    public void onSurfaceCreated(GL10 unsued, EGLConfig config) 
    { 
     GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
    } 

    public void onDrawFrame(GL10 unused) 
    { 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
    } 

    public void onSurfaceChanged(GL10 unused, int width, int height) 
    { 
     GLES20.glViewport(0, 0, width, height); 
    } 
} 

Trước tiên, tôi chắc chắn rằng các thẻ sử dụng-tính năng cho OpenGLES đã được bao gồm trong file AndroidManifest.xml:

enter image description here

Sau đó, khi Tôi đã chạy Debug, ActivityThread.perfo hiển thị thông báo lỗi "Source Not Found". Vì vậy, tôi đã thêm đường dẫn đến nó (và tôi cũng chắc chắn rằng các tập tin android.jar tồn tại trong thư mục)

enter image description here

Tuy nhiên, các ứng dụng bị rơi ngay tại dòng "myGLView = new MyGLSurfaceView (điều này) ". Khi tôi kiểm tra LogCat, nó cho thấy chương trình đã ném ra một IllegalStateException tại cuộc gọi hàm setRenderer().

enter image description here

Vì vậy, tôi có 2 câu đố mà tôi không hiểu tại thời điểm này:

1) Tại sao nó ném một "Nguồn Not Found" thông báo lỗi khi liên kết đến nguồn là được xác định rõ ràng trong dự án?

2) Tại sao nó nói "setRenderer() đã được gọi cho trường hợp này"? Tôi chỉ gọi nó một lần trong lớp con "MyGLSurfaceView" của tôi.

Đối với câu đố thứ nhất, từ những gì tôi đã nghe, Eclipse hầu như luôn luôn gửi thông báo "Không tìm thấy nguồn" khi cho mọi lỗi ngẫu nhiên bạn thực hiện. Đúng không? (nếu không, hãy sửa tôi).

Nếu đúng như vậy, thì tôi nghĩ nguyên nhân gốc rễ của vấn đề có liên quan đến phương thức setRenderer() trong lớp con của tôi. Sau cả ngày rối tung xung quanh, tôi không thể tìm ra cách để khắc phục vấn đề này. Có cơ thể nào cho tôi một số con trỏ của những gì tôi có thể cố gắng khắc phục điều này "IllegalStateException: setRenderer() đã được gọi cho trường hợp này" vấn đề?

Cảm ơn bạn trước sự giúp đỡ của bạn.

+0

Giới thiệu "Nguồn không tìm thấy". Nhìn chủ đề này: http: // stackoverflow.com/questions/14942851/the-source-attachment-does-not-contains-the-source-cho-the-file-layoutinflater-cl –

+0

Giới thiệu về thông báo lỗi "Không tìm thấy nguồn". Xem chủ đề này: http://stackoverflow.com/questions/14942851/the-source-attachment-does-not-contain-the-source-for-the-file-layoutinflater-cl –

Trả lời

41

Tôi đã tìm ra. Sau khi tìm hiểu về các tài liệu của Google, tôi phát hiện ra rằng setEGLContextClientVersion() được gọi là checkRenderThreadState(); chức năng này ném ngoại lệ bất hợp pháp "setRenderer() đã được gọi cho cá thể này" nếu setRenderer() đã được gọi. Vì vậy, thay vì gọi setRenderer() trước tiên, tôi đã gọi setEGLContextClientVersion() đầu tiên, và chương trình được biên dịch và chạy mà không có vấn đề gì. Tôi thấy màn hình xanh lam đẹp hiện trên thiết bị của tôi.

Đây là sự thay đổi mà tôi đã thực hiện:

public MyGLSurfaceView(Context context) 
{ 
    super(context); 
    setEGLContextClientVersion(2); 
    setRenderer (new MyRenderer()); 
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 
+1

Là một phần của việc phân loại ứng dụng Android framework và OpenGL ES 2 Tôi đã viết một trò chơi Breakout sử dụng GLSurfaceView. Nó cũng đi qua các mã trong các tài liệu khuôn khổ/trình diễn nhưng không làm bất cứ điều gì đặc biệt là điên, vì vậy nó vẫn nên làm việc như mã demo. Bạn có thể tìm thấy nó tại http://code.google.com/p/android-breakout/. – fadden

Các vấn đề liên quan