线程使用 - 崩溃在手机上,但不是模拟器

时间:2018-03-14 13:19:12

标签: android

我想在我需要使用它们之前做一些drawables的加载并缩放它们。这是在onCreate()的最后完成的。

new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < Teams.getTeamA().size(); i++) {
                ViewGroup playerLayout = (ViewGroup) inflaterEnd.inflate(R.layout.flip_player_layout, null);
                updatePlayerLayout(playerLayout, R.drawable.card_team_blue, 0, Teams.getTeamA().get(i));
                // Adds the layout to the cardArray
                cardArray.add(playerLayout);
                // Adds the image of the playercard into the bmapArray and scales it
                bmapArray.add(scaleImage(R.drawable.card_big_anoffendedenglishman, scaleFactorDraw));
            }

            for (int i = 0; i < Teams.getTeamB().size(); i++) {
                ViewGroup playerLayout = (ViewGroup) inflaterEnd.inflate(R.layout.flip_player_layout, null);
                updatePlayerLayout(playerLayout, R.drawable.card_team_red, 1, Teams.getTeamB().get(i));
                cardArray.add(playerLayout);
                bmapArray.add(scaleImage(R.drawable.card_big_ancientegypt, scaleFactorDraw)); 
            }
            // End layout
            ViewGroup endLayout = (ViewGroup) inflaterEnd.inflate(R.layout.flip_start_layout, null);
            ImageView imageEnd = (ImageView) endLayout.getChildAt(0);
            imageEnd.setImageBitmap(scaleImage(R.drawable.card_big_placeholder, scaleFactorLayout));
            cardArray.add(endLayout);
        }
    }).start();


 private void updatePlayerLayout(ViewGroup playerLayout, int layoutDrawable, int teamPos, Player player)
    ImageView image1 = (ImageView) playerLayout.getChildAt(0);
    image1.setImageBitmap(scaleImage(layoutDrawable, scaleFactorLayout));

    // CardBack
    ImageView image3 = (ImageView) ((ConstraintLayout) playerLayout.getChildAt(4)).getChildAt(0);
    image3.setImageBitmap(scaleImage(R.drawable.card_big_cardback_beta, scaleFactorDraw));

这在我的模拟器上运行正常,并且不会导致我的应用程序崩溃。当我在手机上加载应用程序时出现问题。 它会加载活动,但几秒后我收到消息&#34; YourApp已停止&#34;。

当我将线程的工作(Lower TeamA和TeamB大小)限制为每个1时,应用程序按预期工作。

我试图将任务划分为多个线程,并且我尝试使用AsyncTask但似乎没有任何工作。我错过了什么?

2 个答案:

答案 0 :(得分:0)

将图像加载到ImageView中会占用大量内存。您可以使用监视手机的调试器,检查它是否在崩溃时抛出OutOfMemoryError。 并且有一些库用于加载具有更好内存管理的图像,例如Glide。

答案 1 :(得分:0)

问题是OutOfMemoryError。我使用的修复程序是将以下代码应用于Manifest.xml文件:

android:largeHeap="true"