2017-02-05 1 views
2

Я довольно новичок в Android Studio, и я стараюсь сделать простое приложение. Случайные изображения должны появляться после нажатия кнопки. Следующий не может быть тем, что уже было показано.Простое приложение для Android - ошибка при отсутствии памяти при работе на смартфоне

У меня есть два класса. MainActivity и RandomCardDraw.

Когда я запускаю приложение в AVD эмуляторе, он не падает. Но иногда я получаю информацию «Пропущенные рамки». Когда я запускаю его на своем Samsung S6, приложение падает каждый раз, когда я пытаюсь получить второе изображение. В Android я вижу ошибку памяти.

Изображения между 100-200 кб и у меня около 18 из них.

Возможно, вы можете увидеть, с чего я столкнулся с Вашими перфомансами?

Вот мой код:

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 с картами заполняется случайным образом. И затем, когда пользователь нажимает кнопку, появляется следующая карта. Как я уже сказал, на моем смартфоне приложение падает, когда я хочу получить второе изображение.

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

пожалуйста, напишите свой StackTrace ...! – Shobhit

+0

Привет shobhit, спасибо за подсказку. Я отредактировал его и поместил код ошибки в свой вопрос. Надеюсь, это то, что вы имели в виду при помощи stacktrace! –

+0

'изображения между 100-200kb'. Какие у них изображения? И какова их резолюция? – greenapps

ответ

2

добавить их в манифесте эти строки:

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

manifest.xml @ your хотел бы быть:

<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

Спасибо за ваш ответ. Я буду проверять его завтра. От взгляда на утверждение, это просто позволяет приложению получить больше ОЗУ? Я имею в виду, что я хотел бы иметь эффективное приложение, которое не будет потреблять 500 МБ ОЗУ. Когда нарисована 1 карта, мой телефон показывает 200 МБ использования ОЗУ для приложения .... –

+0

На самом деле Android: largeHeap - инструмент для увеличения выделенной памяти в приложении. Нет четкого определения необходимости использования этого флага. Если вам нужно больше памяти - у Android есть инструмент для его увеличения. – Shobhit

+0

Хорошо, спасибо. По крайней мере, сейчас это работает.Поскольку моя ошибка исходит из BitmapFactory, можно ли переработать() Bitmap для сохранения памяти? И если да, как это можно сделать? –

Смежные вопросы