Android 无法创建应用程序的子类以与多个活动共享数据
我刚刚完成了游戏中的一些活动,现在我要开始将它们连接起来,以使用真实的游戏数据,而不是我只是为了确保每一块都工作而使用的测试数据。由于多个活动需要访问此游戏数据,我开始研究将此数据传递给我的活动的最佳方式 我知道如何使用putExtra,但是我的GameData类有很多数据,而不仅仅是简单的键值对。除了相当多的基本数据类型外,它还具有大型数组。我真的不想尝试传递所有这些,除非我可以传递整个对象,而不仅仅是键/数据对 我读了下面的帖子,认为这是一条可行之路,但到目前为止,我还没有做到这一点 我创建了一个简单的测试应用程序来尝试这个方法,但它不断崩溃,我的代码看起来和上面的帖子一样——只是我更改了名称。这是我得到的错误。有人能帮我理解我做错了什么吗 12-23 00:50:49.762:错误/AndroidRuntime(608):由以下原因引起:java.lang.ClassCastException:android.app.Application 它在以下语句中崩溃:Android 无法创建应用程序的子类以与多个活动共享数据,android,android-activity,android-context,Android,Android Activity,Android Context,我刚刚完成了游戏中的一些活动,现在我要开始将它们连接起来,以使用真实的游戏数据,而不是我只是为了确保每一块都工作而使用的测试数据。由于多个活动需要访问此游戏数据,我开始研究将此数据传递给我的活动的最佳方式 我知道如何使用putExtra,但是我的GameData类有很多数据,而不仅仅是简单的键值对。除了相当多的基本数据类型外,它还具有大型数组。我真的不想尝试传递所有这些,除非我可以传递整个对象,而不仅仅是键/数据对 我读了下面的帖子,认为这是一条可行之路,但到目前为止,我还没有做到这一点 我创
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>
请帮助我理解此代码为何崩溃
此外,如果您认为让多个活动访问同一数据是错误的做法,请给出您的建议。请记住,我所说的是相当多的变量和一些大型数组。我还没有阅读全部内容,但是:我认为,如果自定义对象实现了parcelable,您可以使用putExtra将其传递给intent 不确定这是否可行,但请尝试使用getApplication()而不是getApplicationContext()。我不确定,但我认为您希望将清单中的这些标记组合成一个标记,如下所示。(您可能还需要完整拼出应用程序的软件包名称,而不是使用首字母
作为快捷方式。)
(顺便说一句,我会避免在应用程序中使用名称
GameData
,在活动中使用名称StaticGameData
;这让我觉得StaticGameData
将是GameData
的一个子类)别担心,我在真正的应用程序中不会使用这些名称。我只是在这个测试应用程序中拼凑了一些名字来测试我在另一篇文章中读到的内容。我将编辑我的帖子,将StaticGameData的名称改为just Main,希望能让它更清晰。我试着做了你建议的这些明显的改变,但还是失败了;但是,我确实同意你的建议使清单更清晰,因此我将使用它并继续查找崩溃的来源。@Mike:尝试捕获从getApplicationContext()返回的值,如:Context appContext=getApplicationContext();GameData newGameData=(GameData)appContext代码>然后在第二行之前设置断点。您应该能够准确地看到作为应用程序上下文返回的对象的类型。(这可能是一个普通的应用程序
,但验证这一点可能会有所帮助。)@Mike:此外,您可能需要卸载并重新安装该应用程序,以使清单更改生效。同样,我不确定,但我认为这是我的经验。我发现了问题。在您显化更改之后,我没有再次查看错误-我只是假设它是相同的错误。当我决定再次检查日志时,我正准备调试您建议的更改以了解返回的对象的类型。猜猜看,随着你的明显变化,它现在给出了一个不同的错误——我理解的错误。它说:“不允许访问构造函数”。现在我想了想,原来的帖子也没有,但在我的版本中我加入了它。我没有意识到在这种情况下我不能使用它。我删除了它,它运行得很好。给你接受的答案,因为你的清单更改给了我一个更可读的错误,我可以修复。再次感谢。我试了一下,但没用。谢谢你的建议。我可能发现了这个问题。我将在一秒钟内测试并发帖。我将对此进行研究,看看这是否更适合我的需要,或者我是否应该继续使用我目前正在测试的方法。谢谢你的意见。
<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>