ParseQuery空指针异常悖论 [英] ParseQuery NullPointer Exception Paradox
问题描述
这是一个后续行动,我的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屋!