发送图像块数组时发生额外的错误?
问题描述:
我想将图像分成16个部分并将其显示在GridView中。 但发送图像块数组时发生错误。 错误是“E/JavaBinder:!!! FAILED BINDER TRANSACTION !!!”发送图像块数组时发生额外的错误?
这个错误的解决方案是什么?
ImageParse.java
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.ArrayList;
public class ImageParse extends AppCompatActivity {
Button btn_split;
ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_parse);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
btn_split = (Button)findViewById(R.id.btn_split);
image = (ImageView)findViewById(R.id.iv_split_image);
btn_split.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
splitImage(image, 16);
}
});
}
private void splitImage(ImageView image, int chunkNumbers)
{
int rows, cols;
int chunkHeight, chunkWidth;
ArrayList<Bitmap> chunkedImages = new ArrayList<>(chunkNumbers);
BitmapDrawable drawable = (BitmapDrawable)image.getDrawable();
Bitmap bitmap = drawable.getBitmap();
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), true);
rows = 4;
cols = 4;
chunkHeight = bitmap.getHeight()/rows;
chunkWidth = bitmap.getWidth()/cols;
int yCoord = 0;
for(int x=0; x < rows; x++)
{
int xCoord = 0;
for(int y=0; y < cols; y++)
{
chunkedImages.add(Bitmap.createBitmap(scaledBitmap, xCoord, yCoord, chunkWidth, chunkHeight));
xCoord += chunkWidth;
}
yCoord += chunkHeight;
}
Intent intent = new Intent(ImageParse.this, ImageChunksActivity.class);
Toast.makeText(this, "FLG1", Toast.LENGTH_SHORT).show();
intent.putExtra("image_chunks", chunkedImages);
startActivity(intent);
}
}
ImageChunksActivity.java
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.widget.GridView;
import android.widget.Toast;
import com.navigationmenu.ListViewAdapter.ImageAdapter;
import java.util.ArrayList;
public class ImageChunksActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_chunks);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
ArrayList<Bitmap> imageChunks = getIntent().getParcelableExtra("image_chunks");
GridView grid = (GridView) findViewById(R.id.gridImages);
grid.setAdapter(new ImageAdapter(this, imageChunks));
grid.setNumColumns((int) Math.sqrt(imageChunks.size()));
}
}
ImageAdapter.java
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import java.util.ArrayList;
public class ImageAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<Bitmap> imageChunks;
private int imageWidth;
private int imageHeight;
public ImageAdapter(Context c, ArrayList<Bitmap> images) {
this.mContext = c;
this.imageChunks = images;
this.imageWidth = ((Bitmap)images.get(0)).getWidth();
this.imageHeight = ((Bitmap)images.get(0)).getHeight();
}
public int getCount() {
return this.imageChunks.size();
}
public Object getItem(int position) {
return this.imageChunks.get(position);
}
public long getItemId(int position) {
return (long)position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView image;
if(convertView == null) {
image = new ImageView(this.mContext);
image.setLayoutParams(new AbsListView.LayoutParams(this.imageWidth - 10, this.imageHeight));
image.setPadding(0, 0, 0, 0);
} else {
image = (ImageView)convertView;
}
image.setImageBitmap((Bitmap)this.imageChunks.get(position));
return image;
}
}
答
但我发送图像块阵列时,得到一个错误。错误是“E/JavaBinder:!!! FAILED BINDER TRANSACTION !!!”
您的Intent
太大。它需要是1MB,实际上应该比这个小很多。
这个错误的解决方案是什么?
可能性包括:
合并这些到一个单一的活动,使用碎片或其他技术来该活动中切换用户界面,让你不必试图通过活动之间的大数据
缓存,或在单缓存管理器位图,铭记,这是故意的内存泄漏,因此需要实施非常仔细地
+0
谢谢。我想我已经找到了如何解决这个问题。 – oflu1071
将那些位图存储在某处使用路径并在gridview中显示它们。 – Raghunandan
我在分割后是否应将大块放在设备内存中? – oflu1071
你喜欢的任何地方。但通过putextra发送位图是不正确的。尽管我不确定确切的数字,但您还可以发送多少数据的限制 – Raghunandan