我在Android的编程新和我,说我的应用程序运行的内存,这所示例我从一本书上抄,它正在与小图片的分辨率,但一个错误,当我加了几张照片具有更大的分辨率出来出现内存错误,可能是我做错了或者只是不知道我还应该使用图像,如果有人知道我应该改变什么,以便这个错误不再出现,请求帮助.谢谢期待!
源代码:
public class ImageViewsActivity extends Activity {
//the images to display
Integer[] imageIDs={
R.drawable.pic1,
R.drawable.pic2,
R.drawable.pic3,
R.drawable.pic4,
R.drawable.pic5
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageView iv=(ImageView) findViewById(R.id.image1);
Gallery gallery=(Gallery) findViewById(R.id.gallery);
gallery.setAdapter(new ImageAdapter(this));
gallery.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View v, int position, long id){
Toast.makeText(getBaseContext(), "pic"+(position+1)+" selected", Toast.LENGTH_SHORT).show();
//display the image selected
try{iv.setScaleType(ImageView.ScaleType.FIT_CENTER);
iv.setImageResource(imageIDs[position]);}catch(OutOfMemoryError e){
iv.setImageBitmap(null);
}
}
});
}
public class ImageAdapter extends BaseAdapter{
private …Run Code Online (Sandbox Code Playgroud) 假设我的代码类似于下面的代码:
protected void onCreate(Bundle bundle){
this.imageView = (ImageView) contentView.findViewById(R.id.imageView);
this.setFirstBitmap();
this.setSecondBitmap();
}
private setFirstBitmap(){
Bitmap bitmap1 = BitmapFactory.decodeFile(bitmapFile1);
imageView.setImageBitmap(bitmap1);
}
private setSecondBitmap(){
Bitmap bitmap2 = BitmapFactory.decodeFile(bitmapFile2);
imageView.setImageBitmap(bitmap2);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,imageView回收bitmap1还是我必须在设置bitmap2之前做到这一点?
我正在创建一个RecyclerView显示图片网格.选择其中一个时,它应该打开一个带有转换的新活动.
我正在使用Glide库加载图片,过渡看起来很糟糕,因为它重新加载了新活动中的图片.所以我不得不将它保存在缓存中,然后将其用于转换.
我有代码,但有时如果图片没有加载,它会抛出Canvas RuntimeException.
这是日志:
07-03 15:19:58.633 28461-28461/jahirfiquitiva.project E/AndroidRuntime? FATAL EXCEPTION: main
Process: jahirfiquitiva.project, PID: 28461
java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@29f09d20
at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1282)
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:599)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:538)
at android.widget.ImageView.onDraw(ImageView.java:1176)
at android.view.View.draw(View.java:15239)
at android.view.View.updateDisplayListIfDirty(View.java:14175)
at android.view.View.getDisplayList(View.java:14197)
at android.view.GhostView.onDraw(GhostView.java:52)
at android.view.View.draw(View.java:15239)
at android.view.View.updateDisplayListIfDirty(View.java:14175)
at android.view.View.getDisplayList(View.java:14197)
at android.view.View.draw(View.java:14967)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.View.updateDisplayListIfDirty(View.java:14170)
at android.view.View.getDisplayList(View.java:14197)
at android.view.View.draw(View.java:14967)
at android.view.ViewGroup.drawChild(ViewGroup.java:3406)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3199)
at android.view.ViewOverlay$OverlayViewGroup.dispatchDraw(ViewOverlay.java:219)
at android.view.View.draw(View.java:15248)
at android.widget.FrameLayout.draw(FrameLayout.java:598)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2906)
at android.view.View.updateDisplayListIfDirty(View.java:14175)
at android.view.View.getDisplayList(View.java:14197)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
at …Run Code Online (Sandbox Code Playgroud) 这个问题与我们是否必须明确地回收位图有关,如果我们不需要它?.
有一个ImageView有一个drawable,当用户点击一个按钮时,它会为ImageView分配一个新的drawable.
我们是否必须销毁属于ImageView的旧drawable,以及如何?
Drawable oriDrawable = imageView.getDrawable()
// set callback to null
oriDrawable.setCallback(null);
// get the bitmap and recycle it
((BitmapDrawable)oriDrawable).getBitmap().recycle();
Run Code Online (Sandbox Code Playgroud)
上面的代码是否正确?什么是最好的解决方案?