Возникли проблемы при создании подкласса приложения для обмена данными с несколькими операциями - PullRequest
2 голосов
/ 23 декабря 2010

Я только что закончил пару действий в своей игре, и теперь я собирался начать соединять их обоих, чтобы использовать реальные игровые данные вместо тестовых данных, которые я использовал, просто чтобы убедиться, что каждая часть работала.Поскольку нескольким Деятельностям потребуется доступ к этим игровым данным, я начал исследовать лучший способ передачи этих данных в Мои Деятельности.

Я знаю об использовании putExtra с намерениями, но мой класс GameData содержит довольно много данных ине просто пары ключ-значение.Помимо нескольких основных типов данных, он также имеет большие массивы.Я действительно не хотел пытаться передать все это, если только я не могу передать весь объект, а не просто пары ключ / данные.

Я прочитал следующий пост и подумал, что это будет путь,но до сих пор у меня не получилось.

Как объявить глобальные переменные в Android?

Я создал простое тестовое приложение, чтобы опробовать этот метод, но он продолжает падать, и мой код выглядит так же, как в посте выше - за исключением того, что я изменил имена.Вот ошибка, которую я получаю.Может кто-нибудь помочь мне понять, что я делаю неправильно?

12-23 00: 50: 49.762: ОШИБКА / AndroidRuntime (608): вызвано: java.lang.ClassCastException: android.app.Application

Вылетает следующее утверждение:

GameData newGameData = ((GameData)getApplicationContext());  

Вот мой код:

package mrk.examples.MainActivity;

import android.app.Application;

public class GameData extends Application {
    private int intTest;

    GameData () {
        intTest = 0;
    }

    public int getIntTest(){
        return intTest;
    }

    public void setIntTest(int value){
        intTest = value;
    }
}

// Моя основная деятельность

package mrk.examples.MainActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

    int intLocal;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        GameData newGameData = ((GameData) getApplicationContext());
        newGameData.setIntTest(0);
        intLocal = newGameData.getIntTest();
        Log.d("MainActivity", "IntLocal = " + intLocal);
        newGameData.setIntTest(1);
        Log.d("MainActivity", "IntLocal = " + intLocal
                + " newGameData IntTest: " + newGameData.getIntTest());
        Intent intentNew = new Intent(this, PassData2Activity.class);
        startActivity(intentNew);
    }
}

// Моя тестовая активность, чтобы увидеть, может ли она получить доступ к данным и своему предыдущему состоянию с последней операции

package mrk.examples.MainActivity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class PassData2Activity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        GameData gamedataPass = ((GameData)getApplicationContext());
        Log.d("PassData2Activity", "gamedatapass IntTest =  " +
                                         gamedataPass.getIntTest());           
    }
}

Ниже приведена соответствующая часть моего манифеста:

<application android:icon="@drawable/icon"
             android:label="@string/app_name">    
    <activity android:name=".MainActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>            
    </activity>

    <activity android:name=".PassData2Activity"></activity>

</application> 

<application android:name=".GameData"
         android:icon="@drawable/icon"
         android:label="@string/app_name">        
</application>

Пожалуйста, помогите мне понять, почему этот код падает?

Кроме того, если вы считаете, что это неправильный подход, позволяющий нескольким действиям иметь доступ к одним и тем же данным, просьба высказать свое мнение.Пожалуйста, имейте в виду, что я имею в виду довольно много переменных и несколько больших массивов.

Ответы [ 3 ]

7 голосов
/ 23 декабря 2010

Я не уверен, но я думаю, что вы хотите объединить эти теги в манифесте в один тег, вот так.(Вам также может понадобиться полностью прописать имя пакета вашего приложения вместо использования начального . в качестве ярлыка.)

<application android:icon="@drawable/icon"
             android:name=".GameData"
             android:label="@string/app_name">    
    <activity android:name=".StaticGameData"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>            
    </activity>

    <activity android:name=".PassData2Activity"></activity>
</application> 

(Кстати, я бы не стал использовать именаGameData для приложения и StaticGameData для действия: это заставляет меня думать, что StaticGameData будет подклассом GameData.)

2 голосов
/ 23 декабря 2010

Не уверен, что это будет работать, но попробуйте использовать getApplication () вместо getApplicationContext ().

0 голосов
/ 23 декабря 2010

Я еще не прочитал всю историю, но: я думаю, вы можете передать пользовательские объекты в намерение с помощью putExtra, если они реализуют parcelable.

...