ParseQuery空指针异常悖论 [英] ParseQuery NullPointer Exception Paradox

查看:305
本文介绍了ParseQuery空指针异常悖论的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个后续行动,我的previous问题:解析RecyclerView图像查询

我现在有一个矛盾的空指针异常。我试图从内部方法提取的清单,下面列出的方式。

 公开名单<&的parseObject GT;链表类;公开名单<串GT;的getData(字符串过滤器){    ParseQuery<&的parseObject GT;查询= ParseQuery.getQuery(图像);
    query.whereEqualTo(类别,过滤器);
    query.findInBackground(新FindCallback<&的parseObject GT;(){        公共无效完成(列表<&的parseObject GT;下载,com.parse.ParseException E){
            如果(E == NULL){
                链表类=下载;
            }其他{
                Log.d(得分,错误:+ e.getMessage());
            }
        }
    });    INT大小= objectList.size();    的for(int i = 0; I<大小;我++){
        ParseFile文件=(ParseFile)objectList.get(I)获得(图像);
        urlList.add(file.getUrl());
    }    返回urlList;}

我该如何解决这个问题?什么样的方式存在,这是优于我所用?

编辑:

下面是它在做什么。在present没有异常,但recyclerview不显示任何内容。

  @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                         捆绑savedInstanceState){
    查看rootView = inflater.inflate(R.layout.activity_events,集装箱,FALSE);
    演出曲目(运动,rootView);
    返回rootView;
}公共无效集(){}公共无效SETLIST(字符串过滤器,查看视图){
    RecyclerView recyclerView =(RecyclerView)view.findViewById(R.id.rv);
    LinearLayoutManager linearLayoutManager =新LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    MyAdapter myAdapter =新MyAdapter(的getData(过滤器));
    recyclerView.setAdapter(myAdapter);
}

编辑2:更多更新的code:

  @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                         捆绑savedInstanceState){
    查看rootView = inflater.inflate(R.layout.activity_events,集装箱,FALSE);
    演出曲目(运动,rootView);
    返回rootView;
}公共无效集(){}公共无效SETLIST(字符串过滤器,查看视图){
    RecyclerView recyclerView =(RecyclerView)view.findViewById(R.id.rv);
    LinearLayoutManager linearLayoutManager =新LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    MyAdapter myAdapter =新MyAdapter(的getData(过滤器));
    recyclerView.setAdapter(myAdapter);
}
私人列表<串GT; urlList =新的ArrayList<>();公开名单<&的parseObject GT;链表类=新的ArrayList<>();
公众诠释大小;公开名单<串GT;的getData(字符串过滤器){
    ParseQuery<&的parseObject GT;查询= ParseQuery.getQuery(图像);
    query.whereEqualTo(类别,过滤器);
    query.findInBackground(新FindCallback<&的parseObject GT;(){        公共无效完成(列表<&的parseObject GT;下载,com.parse.ParseException E){
            如果(E == NULL){
                Toast.makeText(getActivity(),下载检索,Toast.LENGTH_SHORT).show();
                objectList.addAll(下载);
            }其他{
                Log.d(得分,错误:+ e.getMessage());
            }            大小= objectList.size();
        }
    });    的for(int i = 0; I<大小;我++){
        ParseFile文件=(ParseFile)objectList.get(I)获得(图像);
        urlList.add(file.getUrl());
    }    返回urlList;}

编辑3:更新,我已经加入我的适配器code

 查看rootView;@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                         捆绑savedInstanceState){
    rootView = inflater.inflate(R.layout.activity_events,集装箱,FALSE);
    新GetUrlListTask(本).execute(运动);
    返回rootView;
}公共无效集(){}私人列表<串GT; urlList =新的ArrayList<>();公开名单<&的parseObject GT;链表类=新的ArrayList<>();
公众诠释大小;公开名单<串GT;的getData(字符串过滤器){
    ParseQuery<&的parseObject GT;查询= ParseQuery.getQuery(图像);
    query.whereEqualTo(类别,过滤器);
    query.findInBackground(新FindCallback<&的parseObject GT;(){        公共无效完成(列表<&的parseObject GT;下载,com.parse.ParseException E){
            如果(E == NULL){
                Toast.makeText(getActivity(),下载检索,Toast.LENGTH_SHORT).show();
                objectList.addAll(下载);
            }其他{            }            大小= objectList.size();
        }
    });    的for(int i = 0; I<大小;我++){
        ParseFile文件=(ParseFile)objectList.get(I)获得(图像);
        urlList.add(file.getUrl());
    }    返回urlList;}私有类GetUrlListTask扩展的AsyncTask<弦乐,太虚,列表与LT;弦乐>>
{
    私人的WeakReference<片断> weakRef;    公共GetUrlListTask(片段FRAG){
        weakRef =新的WeakReference<片断>(破片);
    }    @覆盖
    保护列表与LT;弦乐> doInBackground(字符串...过滤器){
        返回的getData(过滤器[0]);
    }    @覆盖
    保护无效onPostExecute(列表<串GT; urlList){
        片段FRAG = weakRef.get();
        如果(FRAG!= NULL){
            RecyclerView recyclerView =(RecyclerView)rootView.findViewById(R.id.rv);
            LinearLayoutManager linearLayoutManager =新LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(linearLayoutManager);
            MyAdapter myAdapter =新MyAdapter(urlList);
            recyclerView.setAdapter(myAdapter);
        }
    }
}

和我的适配器:

 列表<串GT;网址;
父母的ViewGroup;公共MyAdapter(列表<串GT;的网址){
    this.urls =网址;
}@覆盖
公共MyViewHolder onCreateViewHolder(ViewGroup中的父母,INT viewType){
    查看查看= LayoutInflater.from(parent.getContext())膨胀(R.layout.image_entry,父母)。
    MyViewHolder myViewHolder =新MyViewHolder(视图);
    this.parent =父母;
    返回myViewHolder;
}@覆盖
公共无效onBindViewHolder(MyViewHolder持有人,INT位置){
    Picasso.with(parent.getContext())
            .load(urls.get(位置))
            .into(holder.photo);
    Toast.makeText(parent.getContext(),urls.get(位置),Toast.LENGTH_LONG).show();
}@覆盖
公众诠释getItemCount(){
    返回urls.size();
}公共静态类MyViewHolder扩展RecyclerView.ViewHolder {    ImageView的照片;    公共MyViewHolder(查看ItemView控件){
        超(ItemView控件);
        照片=(ImageView的)itemView.findViewById(R.id.listImage);    }
}


解决方案

所以我假设你想要做的是,一旦你拿到urlList,要更新一些看法。如果是这样的话,那么我想你想这样做运行在后台的任务,整个方法,而不仅仅是像这样的查询是什么:

首先改变你的getData()方法:

 公开名单<串GT;的getData(字符串过滤器){    ParseQuery<&的parseObject GT;查询= ParseQuery.getQuery(图像);
    query.whereEqualTo(类别,过滤器);    链表类= query.find(); //我觉得你有一个尝试捕捉围绕这个还是有方法抛出一个异常    INT大小= objectList.size();
    的for(int i = 0; I<大小;我++){
        ParseFile文件=(ParseFile)objectList.get(I)获得(图像);
        urlList.add(file.getUrl());
   }    返回urlList;
}

注意,因为你正在做一个网络调用,上述方法现在必须从后台线程运行。

然后你可以使用类似的AsyncTask的更新视图:

 私有类GetUrlListTask扩展的AsyncTask<弦乐,太虚,列表与LT;弦乐>>
{
    私人的WeakReference<片断> weakRef;    公共PhotoTagsFetchTask(片段FRAG){
        weakRef =新的WeakReference<片断>(破片);
    }    @覆盖
    保护无效doInBackground(字符串...过滤器){
        返回的getData(过滤器[0]);
    }    @覆盖
    保护无效onPostExecute(列表<串GT; urlList){
        片段FRAG = weakRef.get();
        如果(FRAG!= NULL){
            RecyclerView recyclerView =(RecyclerView)view.findViewById(R.id.rv);
            LinearLayoutManager linearLayoutManager =新LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(linearLayoutManager);
            MyAdapter myAdapter =新MyAdapter(urlList);
            recyclerView.setAdapter(myAdapter);
        }
    }
}

请注意,上面的使用弱引用是为了避免泄漏的情况下(基本上避免了不必要的内存泄漏)。

您也可以这样做:

 公共无效的getData(字符串过滤器){ParseQuery<&的parseObject GT;查询= ParseQuery.getQuery(图像);
query.whereEqualTo(类别,过滤器);
query.findInBackground(新FindCallback<&的parseObject GT;(){    公共无效完成(列表<&的parseObject GT;下载,com.parse.ParseException E){
        如果(E == NULL){
            链表类=下载;
            INT大小= objectList.size();            的for(int i = 0; I<大小;我++){
              ParseFile文件=(ParseFile)objectList.get(I)获得(图像);
              urlList.add(file.getUrl());
            }            RecyclerView recyclerView =(RecyclerView)view.findViewById(R.id.rv);
            LinearLayoutManager linearLayoutManager =新LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(linearLayoutManager);
            MyAdapter myAdapter =新MyAdapter(urlList);
            recyclerView.setAdapter(myAdapter);
        }其他{
            Log.d(得分,错误:+ e.getMessage());
        }
    }
});}

This is a follow-up to my previous question: Parse RecyclerView Image Query

I am now having a paradoxical nullpointer exception. I am attempting to extract a list from an inner method, in the way outlined below.

public List<ParseObject> objectList;

public List<String> getData(String filter){

    ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
    query.whereEqualTo("category", filter);
    query.findInBackground(new FindCallback<ParseObject>() {

        public void done(List<ParseObject> downloads, com.parse.ParseException e) {
            if (e == null) {
                objectList=downloads;
            } else {
                Log.d("score", "Error: " + e.getMessage());
            }
        }
    });

    int size = objectList.size();

    for (int i = 0; i<size; i++){
        ParseFile file = (ParseFile) objectList.get(i).get("Image");
        urlList.add(file.getUrl());
    }

    return urlList;

}

How do I solve this? What ways exist which are better than what I am using?

EDIT:

Here is what it's doing. At present there are no exceptions, but the recyclerview is not displaying anything.

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.activity_events, container, false);
    setList("sport", rootView);
    return rootView;
}

public void set() {

}

public void setList(String filter, View view){
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    MyAdapter myAdapter = new MyAdapter(getData(filter));
    recyclerView.setAdapter(myAdapter);
}

EDIT 2: More updated code:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.activity_events, container, false);
    setList("sport", rootView);
    return rootView;
}

public void set() {

}

public void setList(String filter, View view){
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);
    MyAdapter myAdapter = new MyAdapter(getData(filter));
    recyclerView.setAdapter(myAdapter);
}


private List<String> urlList = new ArrayList<>();



public List<ParseObject> objectList = new ArrayList<>();
public int size;

public List<String> getData(String filter){


    ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
    query.whereEqualTo("category", filter);
    query.findInBackground(new FindCallback<ParseObject>() {

        public void done(List<ParseObject> downloads, com.parse.ParseException e) {
            if (e == null) {
                Toast.makeText(getActivity(), "Downloads retrieved", Toast.LENGTH_SHORT).show();
                objectList.addAll(downloads);
            } else {
                Log.d("score", "Error: " + e.getMessage());
            }

            size = objectList.size();
        }
    });



    for (int i = 0; i<size; i++){
        ParseFile file = (ParseFile) objectList.get(i).get("Image");
        urlList.add(file.getUrl());
    }

    return urlList;

}

EDIT 3: Updated, and I have added my adapter code.

    View rootView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.activity_events, container, false);
    new GetUrlListTask(this).execute("sport");
    return rootView;
}

public void set() {

}



private List<String> urlList = new ArrayList<>();



public List<ParseObject> objectList = new ArrayList<>();
public int size;

public List<String> getData(String filter){


    ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
    query.whereEqualTo("category", filter);
    query.findInBackground(new FindCallback<ParseObject>() {

        public void done(List<ParseObject> downloads, com.parse.ParseException e) {
            if (e == null) {
                Toast.makeText(getActivity(), "Downloads retrieved", Toast.LENGTH_SHORT).show();
                objectList.addAll(downloads);
            } else {

            }

            size = objectList.size();
        }
    });



    for (int i = 0; i<size; i++){
        ParseFile file = (ParseFile) objectList.get(i).get("Image");
        urlList.add(file.getUrl());
    }

    return urlList;

}

private class GetUrlListTask extends AsyncTask<String,Void,List<String>>
{
    private WeakReference<Fragment> weakRef;

    public GetUrlListTask(Fragment frag){
        weakRef = new WeakReference< Fragment >(frag);
    }

    @Override
    protected List<String> doInBackground(String... filters) {
        return getData(filters[0]);
    }

    @Override
    protected void onPostExecute(List<String> urlList) {
        Fragment frag = weakRef.get();
        if (frag != null){
            RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.rv);
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(linearLayoutManager);
            MyAdapter myAdapter = new MyAdapter(urlList);
            recyclerView.setAdapter(myAdapter);
        }
    }
}

And My adapter:

   List<String> urls;
ViewGroup parent;

public MyAdapter(List<String> urls){
    this.urls=urls;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_entry, parent);
    MyViewHolder myViewHolder = new MyViewHolder(view);
    this.parent=parent;
    return myViewHolder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Picasso.with(parent.getContext())
            .load(urls.get(position))
            .into(holder.photo);
    Toast.makeText(parent.getContext(), urls.get(position), Toast.LENGTH_LONG).show();
}

@Override
public int getItemCount() {
    return urls.size();
}

public static class MyViewHolder extends RecyclerView.ViewHolder{

    ImageView photo;

    public MyViewHolder(View itemView) {
        super(itemView);
        photo = (ImageView) itemView.findViewById(R.id.listImage);

    }
}

解决方案

So I am assuming that what you want to do is once you get the urlList, you want to update some view. If that's the case then I think what you want to do it run that whole method in a background task rather than just the query like so:

First change your getData() method:

public List<String> getData(String filter){

    ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
    query.whereEqualTo("category", filter);

    objectList = query.find(); //I think you have to surround this by a try catch or have the method throw an exception

    int size = objectList.size();
    for (int i = 0; i<size; i++){
        ParseFile file = (ParseFile) objectList.get(i).get("Image");
        urlList.add(file.getUrl());
   }

    return urlList;
}

Note that since you are doing a network call, the above method now HAS to run from a background thread.

Then you can use something like an AsyncTask to update a view:

private class GetUrlListTask extends AsyncTask<String,Void,List<String>>
{
    private WeakReference<Fragment> weakRef;

    public PhotoTagsFetchTask(Fragment frag){
        weakRef = new WeakReference< Fragment >(frag);
    }

    @Override
    protected Void doInBackground(String... filters) {
        return getData(filters[0]);
    }

    @Override
    protected void onPostExecute(List<String> urlList) {
        Fragment frag = weakRef.get();
        if (frag != null){
            RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(linearLayoutManager);
            MyAdapter myAdapter = new MyAdapter(urlList);
            recyclerView.setAdapter(myAdapter);
        }
    }
}

Note that the use of weak reference above is to avoid context leaks (basically avoids unnecessary memory leaks).

You could also do this:

public void getData(String filter){

ParseQuery<ParseObject> query = ParseQuery.getQuery("Images");
query.whereEqualTo("category", filter);
query.findInBackground(new FindCallback<ParseObject>() {

    public void done(List<ParseObject> downloads, com.parse.ParseException e) {
        if (e == null) {
            objectList=downloads;
            int size = objectList.size();

            for (int i = 0; i<size; i++){
              ParseFile file = (ParseFile) objectList.get(i).get("Image");
              urlList.add(file.getUrl());
            }

            RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(linearLayoutManager);
            MyAdapter myAdapter = new MyAdapter(urlList);
            recyclerView.setAdapter(myAdapter);
        } else {
            Log.d("score", "Error: " + e.getMessage());
        }
    }
});



}

这篇关于ParseQuery空指针异常悖论的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆