Handler.dispatchMessage κρέμεται / διακόπτεται όταν χρησιμοποιείται από το νήμα OpenGL

ψήφοι
1

Δουλεύω σε ένα παιχνίδι OpenGL για το Android. Όταν ο χρήστης χάνει το παιχνίδι θα πρέπει να επιστρέψετε στο κύριο μενού, αλλά αυτή η κλήση πρέπει να γίνει από το νήμα OpenGL ES στο νήμα UI και υπάρχει κάποια προβλήματα. Έχω βρεθεί αυτό το post Περάστε μεταβλητές μεταξύ renderer και μια άλλη κατηγορία με queueEvent () και προσπάθησε να προσθέσετε Handler τάξη τον κωδικό:

public class GameActivity extends Activity {

    private GLSurfaceView gameView;
    private int menuViewID;

    private Handler gameOverHandler;

    public GameActivity () {
        super();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        gameOverHandler = new Handler() {

            public void handleMessage (Message msg){
                handleGameOver();
            }
        };
        gameView = new GameView(this, gameOverHandler);
        menuViewID = R.layout.main;

        setContentView(menuViewID);
    }

    /** Called when the user selects the Send button */
    public void startGame(View view) {
        setContentView(gameView);
        gameView.setVisibility(View.VISIBLE);
    }

    private void handleGameOver() {
        /**
         * TODO: switch back to main menu
         */

//      setContentView(menuViewID);         // after this gameView freezes
//      gameView.setVisibility(View.GONE);  // after this application throw an error: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.


    }
}

και στη συνέχεια τον κωδικό OpenGL ES

gameOverHandler.dispatchMessage(Message.obtain(gameOverHandler));

αλλά είμαι ακόμα να πάρει το πάγωμα ή runtime εξαίρεση (βλ σχολίασε γραμμές στην παραπάνω κώδικα). Τι είμαι λείπει εδώ ή να κάνει λάθος;

Με την ευκαιρία, πώς να πάρει την αναφορά για την Προβολή παράδειγμα που ορίζονται στο XML (δείτε menuViewIDστο παραπάνω κώδικα), ή γιατί η findViewByIdμέθοδος επιστρέφει NULL;

Δημοσιεύθηκε 10/09/2012 στις 22:53
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
2

Δεν θέλετε να χρησιμοποιήσετε τη dispatchMessage(msg)μέθοδο. Αυτό είναι προφανώς το ίδιο με απευθείας κλήση του Handler. (Η τεκμηρίωση είναι κακή. Φαίνεται ότι είναι προορίζεται για χρήση του συστήματος).

Δείτε παρόμοια ερώτηση εδώ:

Η διαφορά μεταξύ Handler.dispatchMessage (MSG) και Handler.sendMessage (MSG)

Αντ 'αυτού, μπορείτε να χρησιμοποιήσετε αυτό:

gameOverHandler.obtainMessage(MY_MSG_INT_ID).sendToTarget();
Απαντήθηκε 10/09/2012 στις 23:07
πηγή χρήστη

ψήφοι
0

Έχετε να το χειριστεί στο νήμα UI; Μπορώ να χειριστεί αυτό ακριβώς το πρόστιμο από την κατηγορία παιχνίδι μου χρήση αυτού του κώδικα:

    Intent myIntent = new Intent(myContext, EndGameActivity.class);
    ((Activity)getContext()).startActivityForResult(myIntent, 0);

Απλά ρίχνει το πλαίσιο από τη δραστηριότητα νήμα UI πίσω σε μια δραστηριότητα, και στη συνέχεια να ξεκινήσει νέα μου δραστηριότητα για ένα αποτέλεσμα από εκεί. Έχω στείλει πίσω ένα αποτέλεσμα και στη συνέχεια στη δραστηριότητα μου στο νήμα UI i πιάσει το αποτέλεσμα όπως αυτό:

    @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == 1) { 
       this.finish(); 
    }

} 
Απαντήθηκε 10/09/2012 στις 23:00
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more