使用从JSON加载的图像滚动ListView时出现NullPointerException

时间:2014-12-12 22:02:56

标签: java android json listview nullpointerexception

我在Android中使用ListView时遇到错误,其中填充了图片。图片网址来自tumblr JSON,android查询加载它们。我得到的错误信息是:

12-12 21:55:38.032    4334-4334/com.example.tumblrviewer E/InputEventReceiver﹕ Exception dispatching input event.
12-12 21:55:38.040    4334-4334/com.example.tumblrviewer D/dalvikvm﹕ GC_FOR_ALLOC freed 760K, 12% free 9993K/11292K, paused 5ms, total 6ms
12-12 21:55:38.040    4334-4334/com.example.tumblrviewer E/MessageQueue-JNI﹕ java.lang.NullPointerException
        at com.example.tumblrviewer.MenuArrayAdapter.getView(MenuArrayAdapter.java:76)
        at android.widget.AbsListView.obtainView(AbsListView.java:2161)
        at android.widget.ListView.makeAndAddView(ListView.java:1840)
        at android.widget.ListView.fillDown(ListView.java:675)
        at android.widget.ListView.fillGap(ListView.java:639)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4970)
        at android.widget.AbsListView.onGenericMotionEvent(AbsListView.java:3680)
        at android.view.View.dispatchGenericMotionEventInternal(View.java:7479)
        at android.view.View.dispatchGenericMotionEvent(View.java:7460)
        at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1819)
        at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1772)
        at android.view.View.dispatchGenericMotionEvent(View.java:7453)
        at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1819)
        at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1772)
        at android.view.View.dispatchGenericMotionEvent(View.java:7453)
        at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1819)
        at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1772)
        at android.view.View.dispatchGenericMotionEvent(View.java:7453)
        at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1819)
        at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1772)
        at android.view.View.dispatchGenericMotionEvent(View.java:7453)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchGenericMotionEvent(PhoneWindow.java:1974)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchGenericMotionEvent(PhoneWindow.java:1428)
        at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2460)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:1928)
        at android.view.View.dispatchPointerEvent(View.java:7566)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:132)
        at android.os.Looper.loop(Looper.java:124)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
12-12 21:55:38.044    4334-4334/com.example.tumblrviewer D/AndroidRuntime﹕ Shutting down VM
12-12 21:55:38.044    4334-4334/com.example.tumblrviewer W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4bd3648)
12-12 21:55:38.052    4334-4334/com.example.tumblrviewer E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
        at com.example.tumblrviewer.MenuArrayAdapter.getView(MenuArrayAdapter.java:76)
        at android.widget.AbsListView.obtainView(AbsListView.java:2161)
        at android.widget.ListView.makeAndAddView(ListView.java:1840)
        at android.widget.ListView.fillDown(ListView.java:675)
        at android.widget.ListView.fillGap(ListView.java:639)
        at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4970)
        at android.widget.AbsListView.onGenericMotionEvent(AbsListView.java:3680)
        at android.view.View.dispatchGenericMotionEventInternal(View.java:7479)
        at android.view.View.dispatchGenericMotionEvent(View.java:7460)
        at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1819)
        at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1772)
        at android.view.View.dispatchGenericMotionEvent(View.java:7453)
        at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1819)
        at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1772)
        at android.view.View.dispatchGenericMotionEvent(View.java:7453)
        at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1819)
        at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1772)
        at android.view.View.dispatchGenericMotionEvent(View.java:7453)
        at android.view.ViewGroup.dispatchTransformedGenericPointerEvent(ViewGroup.java:1819)
        at android.view.ViewGroup.dispatchGenericPointerEvent(ViewGroup.java:1772)
        at android.view.View.dispatchGenericMotionEvent(View.java:7453)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchGenericMotionEvent(PhoneWindow.java:1974)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchGenericMotionEvent(PhoneWindow.java:1428)
        at android.app.Activity.dispatchGenericMotionEvent(Activity.java:2460)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchGenericMotionEvent(PhoneWindow.java:1928)
        at android.view.View.dispatchPointerEvent(View.java:7566)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3883)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3778)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5419)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5399)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5370)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5493)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:182)
        at android.os.MessageQueue.nativePollOnce(Native Method)
        at android.os.MessageQueue.next(MessageQueue.java:132)
        at android.os.Looper.loop(Looper.java:124)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

它指向MenuArrayAdapter第76行,其中包含:

        mAQ.id(viewHolder.mImageView).image(item.photos[0].photoUrl.uri, false, false, 600, 0, null, Constants.FADE_IN);

我很确定这个对象不是null,因为错误是随机发生的,每次都在ArrayAdapter中使用不同的项。当我快速,上下滚动ListView时会发生这种情况。我看到图像没有时间加载。它可能与内存问题有关吗?内存和应用程序崩溃的数据太多了?如果是这样,那么什么是一个好的解决方案,如果我想保持无限滚动 - 我不想在底部添加“加载更多”按钮,例如Instagram没有这样的按钮,它可以加载大量的图像。

该类的完整代码如下:

package com.example.tumblrviewer;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;

import com.androidquery.AQuery;
import com.androidquery.callback.AjaxCallback;
import com.androidquery.callback.AjaxStatus;
import com.androidquery.util.Constants;
import com.example.tumblrviewer.model.HomeResponse;
import com.example.tumblrviewer.model.Item;

import org.json.JSONException;
import org.json.JSONObject;


public class MenuArrayAdapter extends ArrayAdapter<Item> {

private final LayoutInflater mInflater;
private final int mResourceId;
private AQuery mAQ;
private int postOffset;
public MenuArrayAdapter(Context context, int resource) {
    super(context, resource);

    mInflater = LayoutInflater.from(context);
    mResourceId = resource;
    mAQ = new AQuery(context);
    postOffset=0;
   //loadImages(postOffset);
}


public void setPosts(Item[] posts) {

    //clear();

    for (Item item : posts) {

        add(item);
    }

    if (isEmpty()) {
        notifyDataSetInvalidated();
    } else {
        notifyDataSetChanged();
    }
}

@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {

    ViewHolder viewHolder = null;

    if (convertView == null) {

        viewHolder = new ViewHolder();
        convertView = mInflater.inflate(mResourceId, viewGroup, false);
        viewHolder.mImageView = (ImageView) convertView.findViewById(R.id.tumblr_photo_iv);
        //viewHolder.mTagsLayout=(LinearLayout) convertView.findViewById(R.id.tags_layout);
        convertView.setTag(viewHolder);
    } else {

        viewHolder = (ViewHolder) convertView.getTag();
    }

    Item item = getItem(i);

   //if ( item.photos[0].photoUrl.uri != null) {
        mAQ.id(viewHolder.mImageView).image(item.photos[0].photoUrl.uri, false, false, 600, 0,  null, Constants.FADE_IN);
   //}

    return convertView;


}


private class ViewHolder {
    ImageView mImageView;
    //LinearLayout mTagsLayout;

}
}

还有主要活动

package com.example.tumblrviewer;

import android.app.Activity;
import android.os.Bundle;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.androidquery.AQuery;
import com.androidquery.callback.AjaxCallback;
import com.androidquery.callback.AjaxStatus;
import com.example.tumblrviewer.model.HomeResponse;

import org.json.JSONException;
import org.json.JSONObject;

public class WeHaveTheMunchiesActivity extends Activity {

private AQuery mAQ;
private TextView mResultTextView;
private ListView mListView;
private MenuArrayAdapter mItemArrayAdapter;
private int postOffset;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list_viewer);
    mListView = (ListView) findViewById(R.id.items_lv);
    mAQ = new AQuery(this);
    mItemArrayAdapter = new MenuArrayAdapter(this, R.layout.item_on_list);
    mListView.setAdapter(mItemArrayAdapter);
    postOffset=0;
    loadImages(postOffset);



    mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView absListView, int i) {

        }

        @Override
        public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {


            int lastItem = firstVisibleItem + visibleItemCount;
            if(lastItem == totalItemCount ){

                if(postOffset <= 10662
                        && mListView.getChildAt(mListView.getChildCount() - 1) != null
                        && mListView.getLastVisiblePosition() == mListView.getAdapter().getCount() - 1
                        && mListView.getChildAt(mListView.getChildCount() - 1).getBottom() <= mListView.getHeight()) {
                    Toast.makeText(getApplicationContext(), "Bottom!", Toast.LENGTH_LONG).show();
                    loadImages(postOffset);
                    System.out.println("postOffset "+postOffset);

                }
            }
        }
    });

}


private void loadImages(int offset) {

    String url = Constants.TUMBLR_API_BLOG_URL + Constants.TUMBLR_API_BLOG_HOSTNAME +
            Constants.TUMBLR_API_CONTENT_TYPE + Constants.TUMBLR_API_KEY_NAME +
            Constants.TUMBLR_API_KEY + "&offset=" + Integer.toString(offset);


    AjaxCallback<JSONObject> cb = new AjaxCallback<JSONObject>();
    cb.url(url).type(JSONObject.class).weakHandler(this, "itemsCallback");
    mAQ.ajax(cb);
    postOffset=postOffset+20;


}

public void itemsCallback(String url, JSONObject json, AjaxStatus status) throws JSONException {
    //Toast.makeText(getApplicationContext(), status.getRedirect(), Toast.LENGTH_LONG).show();
    //Toast.makeText(getApplicationContext(), status.getCode(), Toast.LENGTH_LONG).show();
    //mResultTextView.setText(status.getMessage());
    if (json != null) {
        HomeResponse homeResponse = HomeResponse.fromJsonObject(json.getJSONObject("response"));
        System.out.print(homeResponse.items);
        mItemArrayAdapter.setPosts(homeResponse.items);
    }

}


}

0 个答案:

没有答案
相关问题