【问题标题】:Put extra error when sending image chunks array?发送图像块数组时出现额外错误?
【发布时间】:2017-03-17 17:39:30
【问题描述】:

我想把一张图片分成 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;
    }
}

【问题讨论】:

  • 将这些位图存储在某处使用路径并在 gridview 中显示。
  • 分割后是否应该将块保存在设备内存中?
  • 任何你喜欢的地方。但是通过 putextra 发送位图是不对的。尽管我不确定确切的数字,但您可以发送的数据量也有限制
  • 好的,我明白了。但是如何将设备保存在内存中?你能帮我解决这个问题吗?
  • 你可以看到下面的答案。您可以使用片段在同一活动中显示网格。您可以在 stackvoerflow 上搜索帖子。您应该能够找到对您有帮助的帖子

标签: java android image split


【解决方案1】:

但在发送图像块数组时出现错误。错误是“E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!”

您的Intent 太大。它需要小于 1MB,实际上应该比这小很多。

这个错误的解决方法是什么?

可能性包括:

  • 将这些合并到一个 Activity 中,使用片段或其他技术在该 Activity 中切换 UI,这样您就无需尝试在 Activity 之间传递大量数据

  • 在单例缓存管理器中缓存位图,请记住这是故意的内存泄漏,因此需要非常小心地实施

【讨论】:

  • 谢谢。我想我找到了解决问题的方法。
猜你喜欢
  • 2022-11-22
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2016-05-14
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多