【问题标题】:ClassCastException occuring while retrieving data from intent extras从 Intent Extras 中检索数据时发生 ClassCastException
【发布时间】:2015-09-22 11:58:36
【问题描述】:

在一个 android 应用程序中,我试图将一个可序列化的对象数组从一个片段发送到一个活动。但是当我在活动中反序列化时,它会不断显示类转换异常。

这是寻呼机适配器的代码,其中在图像视图上单击尝试打开活动。

public class ItemImageSliderAdapter extends PagerAdapter {

    Context _context;
    Images[] images;

    public ItemImageSliderAdapter(Context _context, Images[] images) {
        this._context = _context;
        this.images = images;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((ImageView) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView imageView = new ImageView(_context);
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        Picasso.with(_context).load(images[position].getMain()).into(imageView);
        imageView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (images != null) {
                    fullImageSlider(v, images);
                }
            }
        });
        ((ViewPager) container).addView(imageView, 0);
        return imageView;
    }

    @Override
    public int getCount() {
        return images.length;
    }

    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        return arg0 == ((ImageView) arg1);
    }

    public void fullImageSlider(View v, Images[] imageArray) {
        Intent intent = new Intent(v.getContext(), FullScreenImageSlider.class);
        Bundle bundle = new Bundle();
        bundle.putSerializable("data",imageArray);
        bundle.putString("flag", "hello");
        intent.putExtras(bundle);
        v.getContext().startActivity(intent);
    }
}

这是我试图从片段中获取反序列化数据的活动代码

public class FullScreenImageSlider extends Activity {

    Images[] images = null;
    String flag;

    SmartViewPager slidePager;
    CirclePageIndicator pageIndicator;
    ItemImageSliderAdapter slideAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getIntent().getExtras().getSerializable("data") != null) {
            flag = getIntent().getExtras().getString("flag");
            try {
                images = (Images[]) getIntent().getExtras().getSerializable(
                        "data");
            } catch (ClassCastException e) {
                Log.d("ex", "class cast exception");
            }
        }
        setContentView(R.layout.full_screen_slider);
        Log.d("flag", flag);
        findViews();
    }

    private void findViews() {
        slidePager = (SmartViewPager) findViewById(R.id.vp_slider);
        pageIndicator = (CirclePageIndicator) findViewById(R.id.dots);
        /*
         * slideAdapter = new ItemImageSliderAdapter(this, images);
         * slidePager.setAdapter(slideAdapter);
         * pageIndicator.setViewPager(slidePager);
         */
    }

}

这是我用来序列化的模型类的代码。

public class Images implements Serializable{
    private String id;

    private String isdefault;

    private String thumb;

    private String main;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getIsdefault() {
        return isdefault;
    }

    public void setIsdefault(String isdefault) {
        this.isdefault = isdefault;
    }

    public String getThumb() {
        return thumb;
    }

    public void setThumb(String thumb) {
        this.thumb = thumb;
    }

    public String getMain() {
        return main;
    }

    public void setMain(String main) {
        this.main = main;
    }

    @Override
    public String toString() {
        return "ClassPojo [id = " + id + ", isdefault = " + isdefault
                + ", thumb = " + thumb + ", main = " + main + "]";
    }
}

【问题讨论】:

    标签: java android android-intent serialization


    【解决方案1】:

    使用_context 变量启动意图

    public void fullImageSlider(View v, Images[] imageArray) {
            Intent intent = new Intent(_context.getActivity(), FullScreenImageSlider.class);
            Bundle bundle = new Bundle();
            bundle.putSerializable("data",imageArray);
            bundle.putString("flag", "hello");
            intent.putExtras(bundle);
            _context.getActivity().startActivity(intent);
        }
    

    【讨论】:

    • 我已经试过了。即使这样,我也遇到了同样的错误。我不知道为什么会这样。
    • 现在试试这个 Fragment 使用 getActivity() 方法返回它的 Activty,试试使用 _context.getActivity() 或者只是 getActivity()
    【解决方案2】:

    您正在接收 ClassCastException,因为您在尝试使用 getSerializable 方法获取它时,来自 extras 的对象不是 Serializable(它是 Serializable[])。 对于Images,您应该使用Parcelable 而不是Serializable。然后您可以使用bundle.putParcelableArray(key, array); 将您的数据传递给意图。

    【讨论】:

      【解决方案3】:

      如果您使用 android.provider.MediaStore.Images 而不是您的类,请检查您的图像导入类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2013-04-02
        • 1970-01-01
        相关资源
        最近更新 更多