Почему мои виды поверхности не разрушаются после окончания действия? - PullRequest
0 голосов
/ 01 октября 2018

У меня есть домашнее действие, которое запускает несколько других действий для результатов при нажатии кнопки, например

**HomeActivity.class**

Intent firstIntent = new Intent(getBaseContext(), FirstLevelActivity.class);
startActivityForResult(firstIntent, 0);

или

**HomeActivity.class**

Intent secondIntent = new Intent(getBaseContext(), SecondLevelActivity.class);
startActivityForResult(secondIntent, 1);

Класс FirstLevelActivity имеет SurfaceView в своем макете, который называетсяFirstSurfaceView, который присоединяется в начале через макет xml

**FirstLevelActivity.class**

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first_level);
    ...

Он находится в файле макета XML

**activity_first_level.xml**

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.blah.FirstLevelSurfaceView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/firstLevelSurfaceView" />
        ...

firstLevelSurfaceView запускается в потоке, который обновляет метод рисования.

У меня также есть сенсорный обработчик firstLevelSurfaceView, который сообщает о x и y мыши и воспроизводит звук, называемый ударом, и обновляет действие, которому принадлежит вид поверхности

**FirstLevelSurfaceView**

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        float x = event.getX();
        float y = event.getY();
        Log.i(TAG, "x = " + x);
        Log.i(TAG, "y = " + y); 
        hit.play();
        Intent intent = new Intent("update_activity");
        intent.putExtra("update_score", 123);
      LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
    }
}

Это обновление определяет, следует ли сохранять действиеидет или заканчивается, так что, если игра закончена, действие заканчивается.

**FirstLevelActivity.class**

private BroadcastReceiver createBroadcastReceiver() {
    return new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            switch(intent.getAction()) {
                case "update_activity" :
                    // do some calculation to determine whether end game
                    // ok we've reached end game
                    endGame();
                    break;
            }
        }
    }
}

endGame {
    Intent returnIntent = getIntent();
    setResult(Activity.RESULT_OK, returnIntent);
    finish();       
}

Домашнее действие уведомляется. FirstLevelActivity завершено

**HomeActivity.class**

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 0) {
        if(resultCode == Activity.RESULT_OK){
            Log.i(TAG, "FirstLevelAtivity Returned Result OK");
        }
    } else if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            Log.i("Bond", "SecondLevelActivity Returned Result OK");
        }
    } 
}

У меня есть каждый уровень в качестве своего уникального действия с егособственный уникальный SurfaceView, работающий в уникальном потоке.

Моя проблема в том, что, если пользователь запускает SecondLevelActivity (или снова FirstLevelActivity, или любую другую * LevelActivity), вид поверхности дублируется.Поэтому, когда я запускаю свое второе действие, каждое касание экрана вызывает два вызова hit.play (), два журнала x и два журнала y на консоли.Затем, когда я начинаю другое действие, происходит три вызова hit.play (), три журнала x и три журнала y, и так далее, и так далее.Я не понимаю, почему это происходит.

Первоначально у меня было только одно действие, универсальная LevelActivity, затем универсальная LevelSurfaceView, универсальная LevelThread и статический объект, в котором были все данные уровней, и счетчик, который подсчитывал уровень игрока.в то время, когда игрок загружал игру, он выбирал текущий уровень, изображения и звуки.Но проблема все же произошла.Два вызова hit.play (), два журнала и т. Д.

Не уверен, как поступить, чтобы заставить это работать ... Любая помощь приветствуется.

...