我即将完成我的应用程序,最近我遇到了一个无法修复的问题。 我的应用程序包含5个布局,每个布局有1个活动,5个布局。 从我向我的应用程序添加广告以来,我的应用程序声称在ram内存上占用了大量的内容,在切换几个布局后它崩溃了。 我的应用程序大小为10.8mb,但在手机上它需要高达75mb的Ram内存。 这是我从logcat获得的警告:http://prntscr.com/2naqr8 当应用程序崩溃时,这是Logcat:http://prntscr.com/2naret第二部分:http://prntscr.com/2narhi第三部分:http://prntscr.com/2narhi
现在我的代码是非常简单的代码,第一个活动是启动画面,第二个是菜单,其他3个是相同的代码。 菜单代码:
package puske.com;
import com.google.ads.AdRequest;
import com.google.ads.AdView;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class Menu extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.menu);
AdView myAdView = (AdView)findViewById(R.id.adView);
AdRequest adRequest = new AdRequest();
myAdView.loadAd(adRequest);
Button button1=(Button)findViewById(R.id.menu1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Menu.this, Rifles.class));
finish();
}
});
}
此后,它会重复2次以进行其他2项活动。 我的其他3项活动是相同的,只有资源不同。
package puske.com;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class Pistols extends Activity {
private SeekBar volumeSeekbar = null;
private AudioManager audioManager = null;
MediaPlayer mp, mp2, mp3, mp4, mp5, mp6;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pistols);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
initControls();
mp=MediaPlayer.create(this, R.raw.glock);
ImageButton abt1 = (ImageButton) findViewById(R.id.abt1);
abt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mp2.isPlaying()){
mp2.pause();
mp2.seekTo(0);
}
if (mp3.isPlaying()){
mp3.pause();
mp3.seekTo(0);
}
if (mp4.isPlaying()){
mp4.pause();
mp4.seekTo(0);
}
if (mp5.isPlaying()){
mp5.pause();
mp5.seekTo(0);
}
if (mp6.isPlaying()){
mp6.pause();
mp6.seekTo(0);
}
if (mp.isPlaying()){
mp.pause();
mp.seekTo(0);
}
else{
mp.start();
}
}
});
@Override
protected void onDestroy() {
super.onDestroy();
// explicitly release media player
unbindDrawables(findViewById(R.id.pistolz));
System.gc();
}
/**
* Unbinds all drawables in a given view (and its child tree).
*
* @param findViewById Root view of the tree to unbind
*/
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
try
{
((ViewGroup) view).removeAllViews();
}
catch(UnsupportedOperationException ignore)
{
//if can't remove all view (e.g. adapter view) - no problem
}
if(mp!=null){
mp.stop();
mp.release();
mp = null;
}
if(mp2!=null){
mp2.stop();
mp2.release();
mp2 = null;
}
if(mp3!=null){
mp3.stop();
mp3.release();
mp3 = null;
}
if(mp4!=null){
mp4.stop();
mp4.release();
mp4 = null;
}
if(mp5!=null){
mp5.stop();
mp5.release();
mp5 = null;
}
if(mp6!=null){
mp6.stop();
mp6.release();
mp6 = null;
}
findViewById(R.id.pistolz).setVisibility(View.GONE);
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
startActivity(new Intent(Pistols.this, Menu.class));
this.finish();
}
}
就是这样,整个代码我解开所有drawables,释放MP和活动,并且仍然在Device和crashes上占用太多空间。有谁知道这可能导致什么? 最后,这是我的XML,同样,除了IDS和资源
之外,所有布局都是一样的<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@color/black"
android:id="@+id/riflez" >
<SeekBar
android:id="@+id/sikbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="48dp"/>
<ImageButton
android:id="@+id/bt1"
android:layout_width="130dp"
android:layout_height="90dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@null"
android:scaleType="fitXY"
android:src="@drawable/emka" />
<ImageButton
android:id="@+id/bt2"
android:layout_width="130dp"
android:layout_height="90dp"
android:layout_alignRight="@+id/sikbar"
android:layout_alignTop="@+id/bt1"
android:background="@null"
android:scaleType="fitXY"
android:src="@drawable/kalas" />
<ImageButton
android:id="@+id/bt3"
android:layout_width="130dp"
android:layout_height="90dp"
android:layout_alignLeft="@+id/bt1"
android:layout_below="@+id/bt1"
android:layout_marginTop="26dp"
android:background="@null"
android:scaleType="fitXY"
android:src="@drawable/famas" />
<ImageButton
android:id="@+id/bt4"
android:layout_width="130dp"
android:layout_height="90dp"
android:layout_alignLeft="@+id/bt2"
android:layout_alignTop="@+id/bt3"
android:background="@null"
android:scaleType="fitXY"
android:src="@drawable/hekler" />
<ImageButton
android:id="@+id/bt5"
android:layout_width="130dp"
android:layout_height="90dp"
android:layout_alignLeft="@+id/bt3"
android:layout_below="@+id/bt3"
android:layout_marginTop="26dp"
android:background="@null"
android:scaleType="fitXY"
android:src="@drawable/sporet" />
<ImageButton
android:id="@+id/bt6"
android:layout_width="130dp"
android:layout_height="90dp"
android:layout_alignLeft="@+id/bt4"
android:layout_alignTop="@+id/bt5"
android:background="@null"
android:scaleType="fitXY"
android:src="@drawable/uzi" />
<com.google.ads.AdView
android:id="@+id/adView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
ads:adSize="BANNER"
ads:adUnitId="THE ID"
ads:loadAdOnCreate="true" >
</com.google.ads.AdView>
答案 0 :(得分:3)
通常在加载大位图时会发生此错误。 ImageButtons的绘图是否具有高分辨率?如果是这样,这可能是错误。您应该尝试将它们降低到适当的分辨率,但是为了快速修复,在AndroidManifest.xml文件的android:largeHeap="true"
标记下添加<application>
可以允许您的应用加载大型图像而不会出现内存不足错误。
如果以上都不起作用,那么问题就来自代码中的其他地方。但从个人经验来看,位图最容易导致简单的代码因内存问题而崩溃。