2017-02-05 21 views
2

私はAndroidスタジオが新しく、簡単なアプリケーションを作成しようとしています。ボタンをクリックすると、ランダムイメージが表示されます。次は、すでに示されているものにすることはできません。シンプルなAndroid App - スマートフォンで実行中にメモリ不足エラーが発生する

私は2つのクラスを持っています。 MainActivityとRandomCardDrawです。

私はAVDエミュレータでアプリケーションを実行すると、クラッシュしません。しかし、時々私は情報を "スキップされたフレーム"を取得します。私は私のサムスンS6上でそれを実行するとき、私は2番目の画像を取得しようとするたびにアプリケーションがクラッシュします。 Androidでは、メモリ不足エラーが表示されます。

画像は100〜200kbの間にあり、私には約18個あります。

多分あなたはどこから私のperfomanceの問題を得ることができますか?

MainActivity:

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 



public class MainActivity extends AppCompatActivity { 

    ImageView cardView; 
    Button nextCard; 
    RandomCardDraw2 game1 = new RandomCardDraw2(); 
    int counter = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     game1.createRandomCardList(); 
     gameStart(); 


    } 

    public void gameStart() 
    { 
     cardView = (ImageView) findViewById(R.id.cardView); 
     nextCard = (Button) findViewById(R.id.nextCard); 
     nextCard.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 

       if (counter < 19) 
       { 
        int id = getResources().getIdentifier(game1.drawnCards.get(counter), "drawable", getPackageName()); 
        cardView.setImageResource(id); 
        counter++; 
       } 

      } 
     }); 

    } 

} 

そしてRandowmCardDraw:

import java.util.ArrayList; 
import java.util.Random; 


public class RandomCardDraw2 
{ 
    ArrayList<String> drawnCards = new ArrayList<>(); 
    Random rndInt = new Random(); 

    public void createRandomCardList() 
    { 
     boolean gameType = true; 
     int counter; 
     if (gameType == true) 
     { 
      counter = 19; 
      for (int i = 0; i < counter; i++) 
      { 
       String cardId = "card" + rndInt.nextInt(18 + 1); 
       drawnCards.add(cardId); 
      } 
     } 
     else 
     { 
      counter = 23; 
      for (int i = 0; i < counter; i++) 
      { 
       String cardId = "card" + rndInt.nextInt(18 + 1); 
       drawnCards.add(cardId); 
      } 
     } 

    } 
} 

アプリが開かれ

は、ここに私のコードです。カード付きArrayListはランダムに塗りつぶされます。ユーザーがボタンをクリックすると、次のカードが表示されます。私が言ったように、私のスマートフォンで、私は2番目の画像を取得したいときにアプリケーションがクラッシュします。

のErrorCode:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.kajet.shutupanddrink, PID: 18109 
       java.lang.OutOfMemoryError: Failed to allocate a 192000012 byte allocation with 16775360 free bytes and 69MB until OOM 
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856) 
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675) 
        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2228) 
        at android.content.res.Resources.loadDrawableForCookie(Resources.java:4215) 
        at android.content.res.Resources.loadDrawable(Resources.java:4089) 
        at android.content.res.Resources.getDrawable(Resources.java:2005) 
        at android.content.res.Resources.getDrawable(Resources.java:1987) 
        at android.support.v7.widget.ResourcesWrapper.getDrawable(ResourcesWrapper.java:133) 
        at android.content.Context.getDrawable(Context.java:464) 
        at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:26) 
        at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:321) 
        at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:202) 
        at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:192) 
        at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:66) 
        at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:71) 
        at com.example.kajet.shutupanddrink.MainActivity$1.onClick(MainActivity.java:41) 
        at android.view.View.performClick(View.java:5702) 
        at android.widget.TextView.performClick(TextView.java:10888) 
        at android.view.View$PerformClick.run(View.java:22541) 
        at android.os.Handler.handleCallback(Handler.java:739) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7229) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

誰が助けることはできますか?

ありがとうございました!

+0

あなたのスタックトレースを投稿してください...! – Shobhit

+0

こんにちはshobhit、ヒントのおかげで。私はそれを編集し、私の質問にエラーコードを入れました。私はそれがあなたのstacktraceの意味であることを願っています! –

+0

「画像は100〜200kbの間です」。彼らはどのようなイメージですか?彼らの決断は何ですか? – greenapps

答えて

2

追加これらのマニフェストこれらの行で:

android:hardwareAccelerated="false" 
android:largeHeap="true" 

@yourのmanifest.xmlには、希望すること:

<application 
android:allowBackup="true" 
android:hardwareAccelerated="false" 
android:icon="@mipmap/ic_launcher" 
android:label="@string/app_name" 
android:largeHeap="true" 
android:supportsRtl="true" 
android:theme="@style/AppTheme"> 
+0

あなたの答えをありがとう。私は明日それをテストします。ステートメントを見て、これは単にアプリケーションがより多くのRAMを得ることができますか?私は500MBのRAMを食べない効率的なアプリを手に入れたいと思っています。 1枚のカードが描かれると、私の電話はアプリのRAM使用量が200MBになります.... –

+0

実際にアンドロイド:largeHeapは、割り当てられたメモリをアプリに追加するための手段です。 このフラグを使用する必要があるという明確な定義はありません。より多くのメモリが必要な場合 - Androidは、あなたにそれを増やすためのツールを提供します。 – Shobhit

+0

よろしくお願いいたします。少なくとも今は動作します。私のエラーはBitmapFactoryから来ているので、ビットマップをリサイクル()してメモリを節約できますか?そしてもしそうなら、どうすればいいのですか? –

関連する問題