2013-05-02 139 views
1

我正在为android创建一个简单的应用程序,但我正在运行一个奇怪的问题。我有两个活动,一个Dictionary IntentService。 Dictionary IntentService只是将存储在资产文件夹中的文本文件读取到HashMap中。请注意,我在清单中都有两项活动。Android:意图导致崩溃

这是我做的:

Intent intent = new Intent(this, AnActivity.class); 
    startActivity(intent); 
    Intent intentDict = new Intent(this, DictionaryService.class); 
    startService(intentDict); 

的第一项活动运行正常,它加载第二个活动,并表示这是对的Nexus 7仿真器UI。但是,当它试图运行第二个意图我得到这个OutOfMemory错误:

05-02 23:29:48.507: I/dalvikvm(797): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-02 23:29:48.507: I/dalvikvm(797): at android.os.Looper.loop(Looper.java:137) 
05-02 23:29:48.507: I/dalvikvm(797): at android.os.HandlerThread.run(HandlerThread.java:60) 
05-02 23:29:48.517: W/dalvikvm(797): threadid=11: thread exiting with uncaught exception (group=0x40a71930) 
05-02 23:29:48.527: E/AndroidRuntime(797): FATAL EXCEPTION: IntentService[DictionaryService] 
05-02 23:29:48.527: E/AndroidRuntime(797): java.lang.OutOfMemoryError 
05-02 23:29:48.527: E/AndroidRuntime(797): at java.util.HashMap.makeTable(HashMap.java:555) 
05-02 23:29:48.527: E/AndroidRuntime(797): at java.util.HashMap.doubleCapacity(HashMap.java:575) 
05-02 23:29:48.527: E/AndroidRuntime(797): at java.util.HashMap.put(HashMap.java:405) 
05-02 23:29:48.527: E/AndroidRuntime(797): at java.util.HashSet.add(HashSet.java:95) 
05-02 23:29:48.527: E/AndroidRuntime(797): at com.example.androidApp.Dictionary.readInData(Dictionary.java:73) 
05-02 23:29:48.527: E/AndroidRuntime(797): at com.example.androidApp.Dictionary.<init>(Dictionary.java:35) 

现在的问题是,当我独自做这些,他们工作得很好。所以如果我运行这两个意图中的一个,应用程序就能正常工作。我已经尝试从新加载的活动(AnActivity)调用DictionaryService意图,但会导致相同的错误。仿真器也具有1024 Mb的RAM分配,因此它不像它没有足够的内存。有任何想法吗?

感谢

+2

“仿真器也具有1024 Mb的RAM分配,所以它不像它没有足够的内存” - 在模拟设备中有多少RAM。你的应用程序的堆空间会少得多,在16-96MB的范围内。 – CommonsWare 2013-05-03 00:15:36

+0

你正在阅读的文件有多大? – Santa 2013-05-03 00:50:20

+0

@Santa这个文件是2.5 MB,那么你估计得太大了吗?如果是这样,我应该找到另一种实现字典功能的方式吗? – Argilium 2013-05-03 01:22:18

回答

0

如果您收到OutOfMemory异常绕过大意图,那么你最有可能运行出的Dalvik堆内存。尽管本例中的机器具有1024 MB的RAM,但Android根据您正在运行的特定设备将每个Dalvik堆限制为16-64 MB。

有关更多详细信息,请阅读本翔实的答案:Detect application heap size in Android

0

如果任何人有类似的问题,这个问题是由于@santa在评论中表示之前,该文件的大小。所以相反,我把文件分成3个小文件,并在结果中读取它们,并且它的工作原理如下: