2016-01-10 16 views
5

Dưới đây là một thử nghiệm nhỏ mà tôi đã thực hiện, nơi tôi đính kèm một SurfaceTextureListener vào một TextureView trong phần onResume() của một hoạt động.SurfaceTexture có tồn tại một chu kỳ tạm dừng/tiếp tục hoạt động không?

  • trên tươi bắt đầu: một kết cấu bề mặt được làm sẵn ("onSurfaceTextureAvailable")

  • về biến đổi định hướng: như tôi mong đợi, kết cấu bề mặt bị phá hủy ("onSurfaceTextureDestroyed") và một kết cấu bề mặt sau đó được tạo sẵn ("onSurfaceTextureAvailable").

Bây giờ đây là những gì làm tôi ngạc nhiên:

  • trên switch nhiệm vụ sau đó tiếp tục: kết cấu bề mặt không bị phá hủy (không "onSurfaceTextureDestroyed") và một kết cấu bề mặt không được cung cấp (no "onSurfaceTextureAvailable")

Trong những điều kiện này, tôi có đảm bảo rằng SurfaceTexture cũ là stil có hiệu lực? Làm thế nào tôi có thể chắc chắn rằng tôi thực sự biết khi SurfaceTexture của tôi có sẵn? Tại sao thay đổi định hướng lại khác với công tắc nhiệm vụ và tôi nên biết như thế nào?


public class MainActivity extends AppCompatActivity { 
    private final String TAG = "MainActivity"; 
    TextureView mTextureView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mTextureView = (TextureView) findViewById(R.id.textureView); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { 
      @Override 
      public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 
       Log.d(TAG, "onSurfaceTextureAvailable"); 
      } 
      @Override 
      public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 
       Log.d(TAG, "onSurfaceTextureSizeChanged"); 
      } 
      @Override 
      public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
       Log.d(TAG, "onSurfaceTextureDestroyed"); 
       return false; 
      } 
      @Override 
      public void onSurfaceTextureUpdated(SurfaceTexture surface) { 
      } 
     }); 
    } 
} 

Trả lời

0

I'd nói nó không phải là một vấn đề và nó không phải là một "bình thường" hay "dự kiến ​​sẽ được" hành vi. Nó có rất nhiều để làm với phần cứng của thiết bị của bạn và làm thế nào hệ thống xử lý một tình trạng quá tải trong sử dụng tài nguyên hoặc thay đổi harware.

Có thể thiết bị của bạn có bộ tăng tốc đồ họa rất linh hoạt, khi đó bề mặt của bạn có thể tồn tại thay đổi định hướng. Xem điều đó khi thiết bị có tiêu đề, chế độ video thay đổi hoàn toàn và nhớ những lần lập trình cho thiết bị máy tính để bàn khi tất cả bề mặt DirectX (bề mặt là bộ nhớ video) phải được tạo lại sau khi thay đổi chế độ video từ màn hình từ cửa sổ sang màn hình đầy đủ hoặc ngược lại.

Điều tương tự cũng xảy ra khi, có thể ứng dụng của bạn là trò chơi sử dụng tài nguyên nặng sử dụng hết dung lượng bộ nhớ video cho các bề mặt cho kết cấu hoặc backbuffers, hoặc ... Nếu bạn chuyển sang ứng dụng khác một trong những nhu cầu không gian bề mặt, một số hoặc tất cả các bộ nhớ video của bạn nên bị giết cho màn hình mới này để làm việc.

Và do đó ... Bạn thấy không? ... Có thể xảy ra là bạn không sử dụng hết toàn bộ bộ nhớ video hoặc chỉ có một thiết bị badass với phần mềm mới nhất có thể xử lý cả hai ánh sáng hoặc mềm thay đổi không phá hủy tài nguyên của bạn.

Đạo đức của tôi, nếu không vô ích, bài phát biểu là bạn phải xử lý việc hủy trong trường hợp nó bị phá hủy ngay cả khi nó không bao giờ xảy ra trong thiết bị của bạn hoặc bạn sẽ có rất nhiều ngoại lệ. trên null.

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