2011-08-15 35 views
7

Tôi có một trò chơi sử dụng triển khai SurfaceView để hiển thị các đối tượng. Tôi có một chuỗi để vẽ SurfaceView theo thời gian tới màn hình. Trò chơi đang chạy hoàn toàn. Thật không may, nó cần phải có một chức năng tạm dừng bất cứ khi nào trò chơi bị gián đoạn. Vâng, tôi biết rằng tôi cần phải thao tác onResume và .Khởi động lại/Tạm dừng Chủ đề trong onResume/onPause

Nhưng tôi không thể làm đúng. Lỗi này chỉ tôi trở lại surfaceCreated nơi tôi bắt đầu chuỗi cho tôi biết rằng chuỗi đã bắt đầu. Tôi đã thử sử dụng các số resumesuspend trên số onResume và tương ứng nhưng không có gì thay đổi.

Tôi làm cách nào để đạt được điều này? Tôi đã làm như thế nào các vị trí đối tượng sẽ được lưu bằng cách sử dụng File-I/O xử lý.

Xin cảm ơn trước.

+0

bản sao có thể có của [Cách tạm dừng/tiếp tục chuỗi trong Android?] (Http://stackoverflow.com/questions/6776327/how-to-pause-resume-thread-in-android) – Wroclai

+0

Đáng buồn thay. Nó không hoạt động. –

Trả lời

1

Không biết thông tin chi tiết về mã của bạn.

Để "Tạm dừng" một chủ đề mà bạn có thể thực hiện chức năng như vậy:

while(! this.isInterrupted()) 
    if(!paused) 
    { 
     ... Do something ... 
    } else { try { Thread.sleep(100) } catch (InteruptedException ie) {} } 

này là tùy thuộc nếu Do something được hủy bỏ hiệu lực nhìn mặt bạn hay có thể kiểm soát sự tiến triển trong ứng dụng của bạn. Người truy cập vào paused sẽ cho phép bạn tạm dừng và tiếp tục chuỗi của mình mà không bị cuốn vào bất kỳ kiến ​​trúc nào khác.

2

Thực tế, bạn không nên tự mình dừng một sợi, phương pháp stop() không còn được dùng nữa. Giải pháp đơn giản nhất là sử dụng cờ trong vòng while bên trong phương thức run() của luồng. Khi bạn cần phải "dừng" thread, bạn chỉ cần thả cờ để false và thread sẽ không làm bất cứ điều gì nữa, mặc dù nó sẽ tiếp tục chạy. Android sẽ dừng chuỗi của bạn khi cần. Hi vọng điêu nay co ich.

+0

Ok sau đó, làm thế nào sau đó tôi sẽ khởi động lại thread chạy khi tôi đã đặt cờ đang chạy thành false từ 'onPause'. –

+0

@Cyril Horad, Ứng dụng của bạn sẽ chỉ bắt đầu một chuỗi khác với cùng một tác vụ – Egor

+0

Bắt đầu một chuỗi khác? Nhưng không phải là sẽ bắt đầu nhiệm vụ từ đầu? –

3

Đây là những gì tôi đã làm:

@Override 
    public void surfaceCreated(SurfaceHolder arg0) { 
      if (thread.getState() == Thread.State.TERMINATED){ 
       CreateThread(getHolder(),getContext()); 
      } 
      thread.setRunning(true); 
      thread.start(); 
    } 
  • Trong CreateThread bạn nên có thread = new MyThread (...);
  • setRunning (boolean mRun) sử dụng boolean để khởi động/dừng chức năng chạy (tôi nghĩ mình đã được lấy cảm hứng từ LunarLander);

Nếu bạn muốn sử dụng đúng cách onPause/onResume không đặt các biến được sử dụng bởi chuỗi của bạn bên trong chuỗi (như được thực hiện trong LunarLander). Tôi đề nghị bạn làm như thế:

// Variables declarations 

public MyGameThread CreateThread(...){ 
thread = new MyGameThread(holder, context, new Handler() { 
// and so on.... 
}); 
} 

Khi bạn đi qua onPause/onResume, chủ đề của bạn sẽ bị phá hủy và reneweled nhưng nếu bạn đặt các biến của bạn bên ngoài nó, bạn có thể tiếp tục sử dụng chúng sau.

Nếu bạn có một cái gì đó quan trọng để bảo tồn, sử dụng một trong những tùy chọn này:

  • SharedPreferences: một xml sẽ được tạo ra và lưu tại địa phương với các biến mà vẫn tồn tại ngay cả sau khi kết thúc ứng dụng;
  • một db SQL nếu bạn quản lý nhiều hơn 5-10 biến vì trong trường hợp này, việc sử dụng tùy chọn cũ sẽ khó khăn.
+0

Bạn có thể mở rộng thêm điều này không? Tôi không thể vượt qua được. Xin lỗi vì sự phản ứng chậm. –

+0

Vâng, hãy bắt đầu nghiên cứu blog này: http://wonton-games.blogspot.com/2010/06/lunar-lander-resume-game-workaround.html Tôi nhận được rất nhiều về "vấn đề lunarlander" ở đó. Sau đó, quay trở lại với một câu hỏi chi tiết;) – Zappescu

1

tôi không chắc chắn nếu bạn đã có một hoặc hai chủ đề trong câu hỏi này, tôi giả định 2. Bạn cần phải làm ba việc khi bạn gọi onPause:

1 - Save the state of the application (all game variables, states, etc) 
2 - Kill the surfaceView by calling suspend. 
3 - Kill the other thread (we'll call it Thread B). 

Killing của Chủ đề B là vấn đề của bạn tôi nghĩ. Bạn muốn ngắt chuỗi và yêu cầu nó thoát, hoặc khi bạn gọi onPause, chuỗi của bạn vẫn sẽ làm điều đó. Sau đó, khi bạn quay trở lại trò chơi, chủ đề sẽ cố gắng tạo lại một lần nữa gây ra sự cố.Có 2 cách để giết một sợi đúng:

  • Trong while() vòng lặp của chủ đề của bạn, có một 'chạy' boolean mà while(run) sẽ thực thi mã. Khi bạn thay đổi chạy thành false, chuỗi thoát.
  • Nếu chủ đề của bạn ngủ (tôi giả sử nó có thể làm kể từ khi trò chơi của nó và sẽ chạy w.r.t thời gian), hãy bắt số InterruptedException và sau đó thoát khỏi đó. Khi bạn muốn giết chủ đề, bạn ném ngoại lệ cho chuỗi.

Cách thứ nhất là dễ nhất.

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