簡體   English   中英

信號燈崩潰Android應用

[英]Semaphore crashes android app

作為初次嘗試在高中時為Comp Sci制作快速便捷的android應用程序的人,我一直在努力將功能強大的冒險風格游戲移植到android 5.1.1。 您在兩個按鈕之間進行選擇,穿過古老的令人毛骨悚然的房子,您的選擇會影響結果。 我解決的方法是使用帶有switch語句的do循環,使用信號量等待選擇。 使用信號量似乎使我的應用程序崩潰:Logcat沒有顯示任何錯誤,但是當我甚至在使用switch功能之前在開始時放置調試選項時,嘗試獲取信號量時應用程序便崩潰了。 注釋掉信號量可以解決問題。

tl; dr在Android上處理兩鍵選擇的更合適的方法是什么?

這是代碼:

冒險游戲的主要部分

public static Button btnYes, btnNo;
public static TextView textField;
public static Semaphore semaphore = new Semaphore(0);
public static String btnUsed = "";
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_adventure);
    btnYes = (Button) findViewById(R.id.buttonYes);
    btnNo = (Button) findViewById(R.id.buttonNo);
    textField = (TextView) findViewById(R.id.textFieldText);
    textField.setText("Debug Screen! Begin?");
    btnYes.setText("Yes");
    btnNo.setText("No");
    try {
        semaphore.acquire();
        Switch();
    } catch (InterruptedException e) {

    }
}

     public void btnYesClicked(View v) {
    btnUsed = Prompts.yes;
    semaphore.release();
}

    public void btnNoClicked(View v) {
        btnUsed = Prompts.no;
        semaphore.release();
    }
    public static void Switch() throws InterruptedException {
    boolean isRunning = true;
    String place = Prompts.doorway;
    String choice = "";
    do {
        switch (place) {
        case Prompts.doorway:
            semaphore.drainPermits();
            textField.setText(Prompts.doorwayPrompt);
            btnYes.setText(Prompts.kitchen);
            btnNo.setText(Prompts.upstairs);
            semaphore.acquire();
            choice = btnUsed;
            if (choice.equals(Prompts.yes) || choice.equals(Prompts.no)) {
                if (choice.equals(Prompts.yes)) {
                    place = Prompts.kitchen;
                } else {
                    place = Prompts.upstairs;
                }
            } else {
                place = "default";
            }
            break;
        case Prompts.kitchen:
            semaphore.drainPermits();
            textField.setText(Prompts.kitchenPrompt);
            btnYes.setText(Prompts.fridge);
            btnNo.setText(Prompts.cabinet);
            semaphore.acquire();
            choice = btnUsed;
            if (choice.equals(Prompts.yes) || choice.equals(Prompts.no)) {
                if (choice.equals(Prompts.yes)) {
                    place = Prompts.fridge;
                } else {
                    place = Prompts.cabinet;
                }
            } else {
                place = "default";
            }
            break;
        case Prompts.upstairs:
            semaphore.drainPermits();
            textField.setText(Prompts.upstairsPrompt);
            btnYes.setText(Prompts.bedroom);
            btnNo.setText(Prompts.bathroom);
            semaphore.acquire();
            choice = btnUsed;
            if (choice.equals(Prompts.yes) || choice.equals(Prompts.no)) {
                if (choice.equals(Prompts.yes)) {
                    place = Prompts.bedroom;
                } else {
                    place = Prompts.bathroom;
                }
            } else {
                place = "default";
            }
            break;
        case Prompts.fridge:
            semaphore.drainPermits();
            textField.setText(Prompts.fridgePrompt);
            btnYes.setText(Prompts.yes);
            btnNo.setText(Prompts.no);
            semaphore.acquire();
            choice = btnUsed;
            if (choice.equals(Prompts.yes) || choice.equals(Prompts.no)) {
                if (choice.equals(Prompts.yes)) {
                    textField.setText(Prompts.fridgeYes);
                    place = "done";
                } else {
                    textField.setText(Prompts.fridgeNo);
                    place = "done";
                }
            }
            break;
        case Prompts.cabinet:
            semaphore.drainPermits();
            textField.setText(Prompts.cabinetPrompt);
            btnYes.setText(Prompts.yes);
            btnNo.setText(Prompts.no);
            semaphore.acquire();
            choice = btnUsed;
            if (choice.equals(Prompts.yes) || choice.equals(Prompts.no)) {
                if (choice.equals(Prompts.yes)) {
                    textField.setText(Prompts.cabinetYes);
                    place = "done";
                } else {
                    textField.setText(Prompts.cabinetNo);
                    place = "done";
                }
            }
            break;
        case Prompts.bedroom:
            semaphore.drainPermits();
            textField.setText(Prompts.bedroomPrompt);
            btnYes.setText(Prompts.yes);
            btnNo.setText(Prompts.no);
            semaphore.acquire();
            choice = btnUsed;
            if (choice.equals(Prompts.yes) || choice.equals(Prompts.no)) {
                if (choice.equals(Prompts.yes)) {
                    textField.setText(Prompts.bedroomYes);
                    place = "done";
                } else {
                    textField.setText(Prompts.bedroomNo);
                    place = "done";
                }
            }
            break;
        case Prompts.bathroom:
            semaphore.drainPermits();
            textField.setText(Prompts.bathroomPrompt);
            btnYes.setText(Prompts.yes);
            btnNo.setText(Prompts.no);
            semaphore.acquire();
            choice = btnUsed;
            if (choice.equals(Prompts.yes) || choice.equals(Prompts.no)) {
                if (choice.equals(Prompts.yes)) {
                    textField.setText(Prompts.bathroomYes);
                    place = "done";
                } else {
                    textField.setText(Prompts.bathroomNo);
                    place = "done";
                }
            }
            break;
        case "done":
            semaphore.drainPermits();
            btnYes.setText("Again");
            btnNo.setText("Finish");
            semaphore.acquire();
            choice = btnUsed;
            if (choice.equals(Prompts.yes) || choice.equals(Prompts.no)) {
                if (choice.equals(Prompts.yes)) {
                    place = Prompts.doorway;
                } else {
                    isRunning = false;
                }
            }
        default:
            textField.setText("Not a valid answer!");
            break;
        }
    } while (isRunning);
}

活動XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".Adventure">

<TextView android:text="@string/app_name"
    android:layout_width="wrap_content"
    android:id="@+id/textFieldText"
    android:layout_height="wrap_content"
    android:layout_marginTop="73dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/yes"
    android:id="@+id/buttonYes"
    android:layout_alignTop="@+id/buttonNo"
    android:onClick="btnYesClicked"
    android:layout_alignParentStart="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/no"
    android:id="@+id/buttonNo"
    android:layout_centerVertical="true"
    android:onClick="btnNoClicked"
    android:layout_alignParentEnd="true" />

</RelativeLayout>

如評論中所述,您正在阻止UI。 一種更好的處理方法是將String place存儲在字段變量中(例如您所使用的按鈕)。 更改您的Switch()方法以接受選擇參數Switch(String choice)並消除do / while,然后更改btnYesClickedbtnNoClicked來調用Switch方法並傳遞正確的按鈕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM