2017-03-17 53 views
-1

我想将图像分成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; 
    } 
} 
+0

将那些位图存储在某处使用路径并在gridview中显示它们。 – Raghunandan

+0

我在分割后是否应将大块放在设备内存中? – oflu1071

+0

你喜欢的任何地方。但通过putextra发送位图是不正确的。尽管我不确定确切的数字,但您还可以发送多少数据的限制 – Raghunandan

回答

0

但我发送图像块阵列时,得到一个错误。错误是“E/JavaBinder:!!! FAILED BINDER TRANSACTION !!!”

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

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

可能性包括:

  • 合并这些到一个单一的活动,使用碎片或其他技术来该活动中切换用户界面,让你不必试图通过活动之间的大数据

  • 缓存,或在单缓存管理器位图,铭记,这是故意的内存泄漏,因此需要实施非常仔细地

+0

谢谢。我想我已经找到了如何解决这个问题。 – oflu1071