【问题标题】:Null pointer exception on bitmap while scrolling滚动时位图上的空指针异常
【发布时间】:2014-11-02 18:45:46
【问题描述】:

我正在创建一个位图,其中包含裁剪为圆形的 Facebook 图像,代码工作正常,但是在同一个活动中有很多图像,它在滚动时给出空指针异常是我的代码

//enter code here
byte[] decodedString = Base64.decode(obj.picture, Base64.DEFAULT);
                            Bitmap decodedByte =  BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
                     on this line i am getting a null pointer exception
                            Bitmap circleBitmap = Bitmap.createBitmap(decodedByte.getWidth(), decodedByte.getHeight(), Bitmap.Config.ARGB_8888);
                            BitmapShader shader = new BitmapShader(decodedByte, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
                            Paint paint = new Paint();
                            paint.setShader(shader);
                            Canvas c = new Canvas(circleBitmap);
                            c.drawCircle(decodedByte.getWidth() / 2, decodedByte.getHeight() / 2, decodedByte.getWidth() / 2, paint);
                            holder.civilianImage.setImageBitmap(circleBitmap);

我可以看到显示的图像,但是当我滚动时会显示此错误。 任何帮助,将不胜感激。 还有一件事我从 Facebook 获得了图像,但是每张图像的分辨率都与另一张不同,并且在裁剪图像时会丢失很多图像,我该如何管理呢。

enter code here
public class ListViewAdapter extends ArrayAdapter<NewsFeed>
{
    public static final int missionLayout = 0;
    public static final int badgeLayout = 1;
    private static final int TYPE_MAX_COUNT = badgeLayout + 1;
    private NewsFeed obj;
    private LayoutInflater mInflater;
    public ListViewAdapter ()
    {
        super(CityNewsFeedActivity.this,R.layout.activity_activity_city_news_feed,newsfeed);
        mInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getViewTypeCount()

    {
        return TYPE_MAX_COUNT;
    }

    @Override
    public int getItemViewType(int position)
    {
         obj = newsfeed.get(position);
        return obj.category.equals("mission")? missionLayout : badgeLayout;
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder=null;

        if (convertView == null)
        {

            holder = new ViewHolder();
   if (obj.accepted_rejected.equals("success"))
                        {
                            holder.relativeLayoutMission.setBackgroundResource(R.drawable.mission_successful);
                            Float alpha = Float.valueOf("0.9");
                            holder.relativeLayoutMission.setAlpha(alpha);
                            byte[] decodedString = Base64.decode(obj.picture, Base64.DEFAULT);
                            Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
                            Bitmap circleBitmap = Bitmap.createBitmap(decodedByte.getWidth(), decodedByte.getHeight(), Bitmap.Config.ARGB_8888);
                            BitmapShader shader = new BitmapShader(decodedByte, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
                            Paint paint = new Paint();
                            paint.setShader(shader);
                            Canvas c = new Canvas(circleBitmap);
                            c.drawCircle(decodedByte.getWidth() / 2, decodedByte.getHeight() / 2, decodedByte.getWidth() / 2, paint);
                            holder.civilianImage.setImageBitmap(circleBitmap);
                          }
                      }
                return convertView;
                  }
                 }
enter code here
11-02 20:36:11.344  30864-30864/net.httpiamheroic.herioc E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: net.httpiamheroic.herioc, PID: 30864
java.lang.NullPointerException
        at net.httpiamheroic.herioc.net.httpiamherioc.Activities.CityNewsFeedActivity$ListViewAdapter.getView(CityNewsFeedActivity.java:419)
        at android.widget.AbsListView.obtainView(AbsListView.java:2450)
        at android.widget.ListView.makeAndAddView(ListView.java:1891)
        at android.widget.ListView.fillDown(ListView.java:792)
        at android.widget.ListView.fillGap(ListView.java:756)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5728)
        at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4826)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:807)
        at android.view.Choreographer.doCallbacks(Choreographer.java:601)
        at android.view.Choreographer.doFrame(Choreographer.java:561)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:791)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5867)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
        at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 我们需要知道您在滚动视图中是否只使用了一个图像或适配器。还有如果是Adapter,是怎么实现的?
  • 它是一个设置为适配器的listView,在getView中我调用了上面的代码@SuneelPrakash
  • @SuneelPrakash 我更新了我的代码,你可以看看吗。谢谢
  • 请堆栈跟踪...
  • 我更新了它@TacB0sS

标签: android facebook bitmap nullpointerexception


【解决方案1】:

像这样改变你的 getView 方法 还要检查 obj.accepted_rejected.equals("success") 是否为假

 @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder=null;
        // Your row view 
        View rowView = convertView;

        if (rowView == null)
        {
            // New holder object 
            holder = new ViewHolder();
            holder.civilianImage = rowView.findViewById(R.id.civilianimageview);// Your xml image view id

                            rowView.setTag(holder);

           } else{
                // Use existing holder object 
              holder=(ViewHolder) rowView.getTag();
           }
        if (obj.accepted_rejected.equals("success")){
            holder.relativeLayoutMission.setBackgroundResource(R.drawable.mission_successful);
            Float alpha = Float.valueOf("0.9");
            holder.relativeLayoutMission.setAlpha(alpha);
            byte[] decodedString = Base64.decode(obj.picture, Base64.DEFAULT);
            Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
            Bitmap circleBitmap = Bitmap.createBitmap(decodedByte.getWidth(), decodedByte.getHeight(), Bitmap.Config.ARGB_8888);
            BitmapShader shader = new BitmapShader(decodedByte, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            Paint paint = new Paint();
            paint.setShader(shader);
            Canvas c = new Canvas(circleBitmap);
            c.drawCircle(decodedByte.getWidth() / 2, decodedByte.getHeight() / 2, decodedByte.getWidth() / 2, paint);
            holder.civilianImage.setImageBitmap(circleBitmap);
        }else{
            // Handle this case
        }
          return rowView;
     }

【讨论】:

  • 什么是rowView?是的,我正在处理 if(obj.accepted_rejected.equals("success")) 的 else,但仍然出现错误
  • 更改了代码,您必须每次都使用位图创建,不仅在 convertview 为空时。请尝试告诉我。
  • 问题是当我在活动启动时直接快速滚动时它崩溃但是当我轻轻地这样做时它并不奇怪
  • 您需要有一个加载器,直到获取第一个最小视图。位图处理通常需要时间
【解决方案2】:

不幸的是(愚蠢地)在 Android 中与图像处理有关的多个方法在提供不是图像的数据时不会引发异常,它们只是返回 null...WTH?

所以看起来错误的原因是由于输入错误:

byte[] decodedByte = BitmapFactory.decodeByteArray(...)

返回 null,并强制应用在尝试使用 decodedByte

的下一行崩溃
Bitmap circleBitmap = Bitmap.createBitmap(decodedByte.getWidth(), decodedByte.getHeight(), Bitmap.Config.ARGB_8888);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2019-12-04
    • 2016-04-16
    • 1970-01-01
    • 2021-01-19
    • 2019-07-18
    相关资源
    最近更新 更多