【问题标题】:I get this error: BitmapFactory.nativeDecodeAsset()我收到此错误:BitmapFactory.nativeDecodeAsset()
【发布时间】:2012-12-10 03:59:04
【问题描述】:

我的应用程序遇到了很多错误,我是编码新手,所以我希望能得到一些帮助。

我有一个应用程序,其中包含一些用户可以设置为壁纸的图像,这些图像是可绘制的,我将它们放在一个 Horizo​​ntalScrollView 中,我还有一个显示所选图像的 ImageView。

这就是我的 Main.java 的样子:

public class Main extends Activity implements OnClickListener {

ImageView display;
int wallPaper;
private AdView adView;
Bitmap setWall2;
Bitmap setWall3;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    /* START OF AdMob */

    // Create the adView
    adView = new AdView(this, AdSize.BANNER, "***************");

    // Lookup your LinearLayout assuming it’s been given
    // the attribute android:id="@+id/mainLayout"
    TableRow layout = (TableRow)findViewById(R.id.adView);

    // Add the adView to it
    layout.addView(adView);

    // Initiate a generic request to load it with an ad
    adView.loadAd(new AdRequest());

    /* END OF AdMob */


    wallPaper = R.drawable.image1;

    display = (ImageView) findViewById(R.id.iViewMain);
    ImageView image1 = (ImageView) findViewById(R.id.image1);
    ImageView image2 = (ImageView) findViewById(R.id.image2);
    ImageView image3 = (ImageView) findViewById(R.id.image3);
    ImageView image4 = (ImageView) findViewById(R.id.image4);
    ImageView image5 = (ImageView) findViewById(R.id.image5);
    ImageView image6 = (ImageView) findViewById(R.id.image6);
    ImageView image7 = (ImageView) findViewById(R.id.image7);
    ImageView image8 = (ImageView) findViewById(R.id.image8);
    ImageView image9 = (ImageView) findViewById(R.id.image9);
    ImageView image10 = (ImageView) findViewById(R.id.image10);
    ImageView image11 = (ImageView) findViewById(R.id.image11);
    ImageView image12 = (ImageView) findViewById(R.id.image12);
    ImageView image13 = (ImageView) findViewById(R.id.image13);

    Button setWall = (Button) findViewById(R.id.setWall);

    image1.setOnClickListener(this);
    image2.setOnClickListener(this);
    image3.setOnClickListener(this);
    image4.setOnClickListener(this);
    image5.setOnClickListener(this);
    image6.setOnClickListener(this);
    image7.setOnClickListener(this);
    image8.setOnClickListener(this);
    image9.setOnClickListener(this);
    image10.setOnClickListener(this);
    image11.setOnClickListener(this);
    image12.setOnClickListener(this);
    image13.setOnClickListener(this);

    setWall.setOnClickListener(this);

}

@SuppressWarnings("deprecation")
public void onClick(View v) {
    // TODO Auto-generated method stub

    switch (v.getId()) {
    case R.id.image1:
        display.setImageResource(R.drawable.image1);
        wallPaper = R.drawable.image1;
        break;
    case R.id.image2:
        display.setImageResource(R.drawable.image2);
        wallPaper = R.drawable.image2;
        break;
    case R.id.image3:
        display.setImageResource(R.drawable.image3);
        wallPaper = R.drawable.image3;
        break;
    case R.id.image4:
        display.setImageResource(R.drawable.image4);
        wallPaper = R.drawable.image4;
        break;
    case R.id.image5:
        display.setImageResource(R.drawable.image5);
        wallPaper = R.drawable.image5;
        break;
    case R.id.image6:
        display.setImageResource(R.drawable.image6);
        wallPaper = R.drawable.image6;
        break;
    case R.id.image7:
        display.setImageResource(R.drawable.image7);
        wallPaper = R.drawable.image7;
        break;
    case R.id.image8:
        display.setImageResource(R.drawable.image8);
        wallPaper = R.drawable.image8;
        break;
    case R.id.image9:
        display.setImageResource(R.drawable.image9);
        wallPaper = R.drawable.image9;
        break;
    case R.id.image10:
        display.setImageResource(R.drawable.image10);
        wallPaper = R.drawable.image10;
        break;
    case R.id.image11:
        display.setImageResource(R.drawable.image11);
        wallPaper = R.drawable.image11;
        break;
    case R.id.image12:
        display.setImageResource(R.drawable.image12);
        wallPaper = R.drawable.image12;
        break;
    case R.id.image13:
        display.setImageResource(R.drawable.image13);
        wallPaper = R.drawable.image13;
        break;
    case R.id.setWall:

        InputStream setWall3 = getResources().openRawResource(wallPaper);
        Bitmap setWall2 = BitmapFactory.decodeStream(setWall3);
        try {
            getApplicationContext().setWallpaper(setWall2);
            Context context = getApplicationContext();
            CharSequence text = "Wallpaper set!";
            int duration = Toast.LENGTH_SHORT;

            Toast toast = Toast.makeText(context, text, duration);
            toast.setGravity(Gravity.TOP|Gravity.RIGHT, 0, 0);
            toast.show();
        } catch(IOException e) {
            e.printStackTrace();
        }

        break;

    }
    System.gc();
}


@Override
protected void onResume() {
    // TODO Auto-generated method stub
    System.gc();
    super.onResume();

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    display = null;
    setWall2 = null;
    setWall3 = null;
    System.gc();
    super.onPause();
}

@Override
protected void onDestroy() {
    // TODO Auto-generated method stub

    ImageView image1 = (ImageView) findViewById(R.id.image1);
    image1.setImageDrawable(null);
    ImageView image2 = (ImageView) findViewById(R.id.image2);
    image2.setImageDrawable(null);
    ImageView image3 = (ImageView) findViewById(R.id.image3);
    image3.setImageDrawable(null);
    ImageView image4 = (ImageView) findViewById(R.id.image4);
    image4.setImageDrawable(null);
    ImageView image5 = (ImageView) findViewById(R.id.image5);
    image5.setImageDrawable(null);
    ImageView image6 = (ImageView) findViewById(R.id.image6);
    image6.setImageDrawable(null);
    ImageView image7 = (ImageView) findViewById(R.id.image7);
    image7.setImageDrawable(null);
    ImageView image8 = (ImageView) findViewById(R.id.image8);
    image8.setImageDrawable(null);
    ImageView image9 = (ImageView) findViewById(R.id.image9);
    image9.setImageDrawable(null);
    ImageView image10 = (ImageView) findViewById(R.id.image10);
    image10.setImageDrawable(null);
    ImageView image11 = (ImageView) findViewById(R.id.image11);
    image11.setImageDrawable(null);
    ImageView image12 = (ImageView) findViewById(R.id.image12);
    image12.setImageDrawable(null);
    ImageView image13 = (ImageView) findViewById(R.id.image13);
    image13.setImageDrawable(null);

    display = null;
    setWall2 = null;
    setWall3 = null;
    System.gc();
    super.onDestroy();
}

}

谢谢!

【问题讨论】:

    标签: android image bitmap


    【解决方案1】:

    您是否在关注 Youtube 上的教程?我也从其中一些开始,但学习了一些关于复合视图/视图组的非常低效的编码实践。首先,您真的不应该静态地创建这么多 imageView 对象并为每个对象设置单独的侦听器。这真的是非常糟糕的做法。所以完全避免这种方法。我的意思是,从现在开始习惯以正确的方式做事,这样你就不必像我一样回来改变/重新学习/把头撞到墙上太多:)!

    您需要使用专门为此目的构建的 GridView、ListView、ViewFlipper、Gallery 或其他类型的容器。在使用当前方法时,您会不断遇到位图和 OOM 错误

    TUTORIAL ON GRIDVIEW

    TUTORIAL ON GALLERY

    【讨论】:

    • 您也不需要显式强制垃圾回收。
    • 谢谢各位,我明白你们在说什么。你是对的,我主要是通过观看 youtube 上的教程来学习。感谢您指引我正确的方向,我会尝试重写应用程序。
    • 任何时候的人。顺便说一句,不要误会我的意思,这些教程是一个很好的起点,但是它们教授了很多原始技术,而没有深入了解基础知识……也许这是一件好事,因为我继续自己学习越来越多与大量其他来源。坚持下去!
    • 一点也不,我同意你的看法。这是一种快速的学习方式,但就像您所说的那样,这是他们教出来的原始技术。谢谢
    • @JadeByfield 这个问题能麻烦你吗,你知道从在线画廊获取图片的好方法吗?就像我想让我的应用从 flickr 获取图片,然后让用户将图片设置为他们的壁纸。
    猜你喜欢
    • 2013-07-31
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2012-05-17
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多