玩来玩去还是空指针的问题

玩来玩去还是空指针的问题

package com.ygz.tuangou_3_2_homework.adapter;

import android.content.Context;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.ygz.tuangou_3_2_homework.R;
import com.ygz.tuangou_3_2_homework.bean.Menu;

import java.util.List;

/**
* Created by Administrator on 2018/9/9/009.
*/

public class MyListViewAdapter extends BaseAdapter {

   private Context context;
   private List<Menu.MenuInfo> mMenuInfos;

   public MyListViewAdapter(Context context, List<Menu.MenuInfo> mMenuInfos) {
       this.context = context;
       this.mMenuInfos = mMenuInfos;
   }

   @Override
   public int getCount() {
       return mMenuInfos.size();
   }

   @Override
   public Object getItem(int i) {
       return mMenuInfos.get(i);
   }

   @Override
   public long getItemId(int i) {
       return i;
   }

   @Override
   public View getView(int i, View view, ViewGroup viewGroup) {
       MenuViewHolder menuViewHolder = null;
       if (view == null){
           //初始化holder对象
           menuViewHolder = new MenuViewHolder();
           //把条目布局转化为view对象
           view = View.inflate(context, R.layout.list_item, null);
           //初始化holder对象,并初始化holder中的控件
           menuViewHolder.mName = view.findViewById(R.id.item_name);
           menuViewHolder.mDescription = view.findViewById(R.id.item_description);
           menuViewHolder.mPrice = view.findViewById(R.id.item_price);
           menuViewHolder.mAction = view.findViewById(R.id.item_action);
           menuViewHolder.mCount = view.findViewById(R.id.item_count);
           menuViewHolder.mImageView = view.findViewById(R.id.item_iv);
           //给当前view做个标记,并把数据存到该tag中
           view.setTag(menuViewHolder);
       }else {
           //如果当前view存在,则直接从中取出其保存的控件及数据
           menuViewHolder = (MenuViewHolder) view.getTag();
           Menu.MenuInfo menuInfo = mMenuInfos.get(i);
           menuViewHolder.mImageView.setImageResource(Integer.parseInt(menuInfo.mImg));
           menuViewHolder.mDescription.setText(menuInfo.mDescription);
           menuViewHolder.mName.setText(menuInfo.mName);
           menuViewHolder.mPrice.setText((int) menuInfo.mPrice);
           menuViewHolder.mAction.setText(menuInfo.mAction);
           menuViewHolder.mCount.setText(menuInfo.mCount);
       }
       return view;
   }

   public class MenuViewHolder {
       public TextView mName, mDescription, mPrice, mAction, mCount;
       public ImageView mImageView;
   }
}


package com.ygz.tuangou_3_2_homework.bean;

import android.graphics.Bitmap;

import java.util.ArrayList;
import java.util.List;

/**
* Created by Administrator on 2018/9/9/009.
*/

public class Menu {

   public int mStatus;
   public String mMsg;
   public List<MenuInfo> mMenuInfos;

   /*public String getmMsg() {
       return mMsg;
   }

   public void setmMsg(String mMsg) {
       this.mMsg = mMsg;
   }

   public int getmStatus() {
       return mStatus;
   }

   public void setmStatus(int mStatus) {
       this.mStatus = mStatus;
   }

   public List<MenuInfo> getmMenuInfos() {
       return mMenuInfos;
   }

   public void setmMenuInfos(List<MenuInfo> mMenuInfos) {
       this.mMenuInfos = mMenuInfos;
   }*/

   @Override
   public String toString() {
       return "Menu{" +
               "mStatus=" + mStatus +
               ", mMsg='" + mMsg + '\'' +
               ", mMenuInfos=" + mMenuInfos +
               '}';
   }
   public static class MenuInfo {

       public int mId;
       public int mCount;
       public String mName;
       public String mImg;
       public double mPrice;
       public String mDescription;
       public String mAction;

       /*public int getmId() {
           return mId;
       }

       public void setmId(int mId) {
           this.mId = mId;
       }

       public int getmCount() {
           return mCount;
       }

       public void setmCount(int mCount) {
           this.mCount = mCount;
       }

       public String getmName() {
           return mName;
       }

       public void setmName(String mName) {
           this.mName = mName;
       }

       public String getmImg() {
           return mImg;
       }

       public void setmImg(String mImg) {
           this.mImg = mImg;
       }

       public double getmPrice() {
           return mPrice;
       }

       public void setmPrice(double mPrice) {
           this.mPrice = mPrice;
       }

       public String getmDescription() {
           return mDescription;
       }

       public void setmDescription(String mDescription) {
           this.mDescription = mDescription;
       }

       public String getmAction() {
           return mAction;
       }

       public void setmAction(String mAction) {
           this.mAction = mAction;
       }*/

       @Override
       public String toString() {
           return "MenuInfo{" +
                   "mId=" + mId +
                   ", mCount=" + mCount +
                   ", mName='" + mName + '\'' +
                   ", mImg='" + mImg + '\'' +
                   ", mPrice='" + mPrice + '\'' +
                   ", mDescription='" + mDescription + '\'' +
                   ", mAction='" + mAction + '\'' +
                   '}';

       }
   }

}


package com.ygz.tuangou_3_2_homework.fragment;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.GridView;
import android.widget.ListView;
import com.ygz.tuangou_3_2_homework.R;
import com.ygz.tuangou_3_2_homework.adapter.MyGridViewAdapter;
import com.ygz.tuangou_3_2_homework.adapter.MyListViewAdapter;
import com.ygz.tuangou_3_2_homework.bean.Menu;
import com.ygz.tuangou_3_2_homework.util.DownAsynctask;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
* Created by Administrator on 2018/9/7/007.
*/

public class HomeFragment extends Fragment {

   public static final String MENU_URL = "http://www.imooc.com/api/shopping?type=11";
   private static final String TAG = "HomeFragment";
   private View view;
   private GridView mGridView;
   private MyGridViewAdapter gridViewAdapter;
   private MyListViewAdapter listAdapter;
   private ListView mListView;
   private ArrayList<Menu.MenuInfo> menuInfos;
   private boolean flag = false;
   private int pageNo = 1;
   private ExecutorService es;
   private MyHandler mHandler = new MyHandler(this);
   int[] images = new int[]{R.drawable.fly1, R.drawable.car, R.drawable.autombile1,
           R.drawable.dangao, R.drawable.food, R.drawable.watch, R.drawable.cp, R.drawable.phone};

   String[] imagesText = new String[]{"飞机", "车票", "汽车", "蛋糕", "美食", "手表", "电脑", "手机"};

   @Nullable
   @Override
   public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
       view = inflater.inflate(R.layout.fragment_home, container, false);
       //使用线程池来实现异步任务的多线程下载
       es = Executors.newFixedThreadPool(10);
       new DownAsynctask(menuInfos,listAdapter,getActivity()).executeOnExecutor(es, MENU_URL);
       initView();
       return view;
   }

   private void initView() {
       mGridView = view.findViewById(R.id.gridView);
       gridViewAdapter = new MyGridViewAdapter(images,imagesText,getActivity());
       mGridView.setAdapter(gridViewAdapter);
       mListView = view.findViewById(R.id.list_view);
       //存放json解析的数据的集合
       menuInfos = new ArrayList<Menu.MenuInfo>();
       //自定义适配器
       listAdapter = new MyListViewAdapter(getActivity(),menuInfos);
       //给listview设置适配器
       mListView.setAdapter(listAdapter);

       /**
        * 对listview设置滚动监听事件,实现分页加载数据
        */
       mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
           @Override
           public void onScrollStateChanged(AbsListView absListView, int scrollState) {
               //如果停止了滑动且滑动到了结尾,则更新数据,加载下一页
               if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && flag == true) {
                   pageNo += 1;
                   new DownAsynctask(menuInfos,listAdapter,getActivity()).executeOnExecutor(es, MENU_URL);
               }
           }

           @Override
           public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
               //判断是否滑动到了结尾
               if (firstVisibleItem + visibleItemCount == totalItemCount) {
                   flag = true;
               }else {
                   flag = false;
               }
           }
       });
   }


   private  static class MyHandler extends Handler{
       WeakReference<HomeFragment> mWeakReference;

       public MyHandler(HomeFragment activity) {
           mWeakReference = new WeakReference<HomeFragment>(activity);
       }

       @Override
       public void handleMessage(Message msg) {
           super.handleMessage(msg);
           if (msg.what ==123){
               String result = (String) msg.obj;
               HomeFragment activity = mWeakReference.get();
           }
       }
   }
}


package com.ygz.tuangou_3_2_homework.util;

import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;

import com.ygz.tuangou_3_2_homework.adapter.MyListViewAdapter;
import com.ygz.tuangou_3_2_homework.bean.Menu;

import java.util.ArrayList;
import java.util.List;

/**
* Created by Administrator on 2018/9/9/009.
*/

public class DownAsynctask extends AsyncTask<String,Void,byte[]> {

   private List<Menu.MenuInfo> mMenuInfos = new ArrayList<>();
   private MyListViewAdapter listViewAdapter;
   private Context context;

   public DownAsynctask(List<Menu.MenuInfo> mMenuInfos, MyListViewAdapter listViewAdapter, Context context) {
       this.mMenuInfos = mMenuInfos;
       this.listViewAdapter = listViewAdapter;
       this.context = context;
   }

   /**
    * 当主线程中调用executeOnExecutor方法或execute方法时,会调用此方法
    *
    * @param strings
    * @return
    */
   @Override
   protected byte[] doInBackground(String... strings) {
       //下载网络数据
       return NetUtils.getNetData(strings[0]);
   }

   /**
    * doInBackground方法执行之后会执行此方法,并把结果传过来
    *
    * @param result
    */
   @Override
   protected void onPostExecute(byte[] result) {
       super.onPostExecute(result);
       if (result != null) {
           //把从网络上获取的byte类型的数据转换为String字符串
           String jsonString = new String(result);
           //用json解析工具来解析该字符串数据
           Menu menu = JsonUtils.parseJson(jsonString);
           //取出mMenuInfos数据,并保存到集合中
           mMenuInfos.addAll(menu.mMenuInfos);
           //刷新数据
           listViewAdapter.notifyDataSetChanged();
       }else {
           Toast.makeText(context, "网络异常", Toast.LENGTH_SHORT).show();
       }
   }
}


package com.ygz.tuangou_3_2_homework.util;

import com.google.gson.Gson;
import com.ygz.tuangou_3_2_homework.bean.Menu;

/**
* Created by Administrator on 2018/9/9/009.
*/

public class JsonUtils {
   public static Menu parseJson(String jsonString){
       Gson gson = new Gson();
       Menu menu = gson.fromJson(jsonString,Menu.class);
       return menu;
   }

}


package com.ygz.tuangou_3_2_homework.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
* Created by Administrator on 2018/9/9/009.
*/

public class NetUtils {
   public static byte[] getNetData(String urlString){
       try {
           URL url = new URL(urlString);
           HttpURLConnection connection = (HttpURLConnection) url.openConnection();
           connection.setRequestMethod("GET");
           connection.setConnectTimeout(5000);
           connection.setConnectTimeout(5000);

           byte[] result = null;
           if (connection.getResponseCode() ==200){
               InputStream inputStream = connection.getInputStream();
               ByteArrayOutputStream baos = new ByteArrayOutputStream();
               byte[] buffer = new byte[1024];
               int len = 0;
               while ((len = inputStream.read(buffer))!=-1){
                   baos.write(buffer,0,len);
               }
               result = baos.toByteArray();
               return result;
           }
       } catch (MalformedURLException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
       return null;
   }
}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
irista23 2018-09-11 18:51:51

你检查下红框方法的返回值,如果不为null代码是你之后onPostExecute()中传值的问题,如果为null,代表没有成功从服务器取到数据,那再检查联网操作

http://img1.sycdn.imooc.com//climg/5b979dee0001fcea05160224.jpg

  • 提问者 Ygz_ #1
    我现在没用那个封装方法,就是普通的Json解析,网络请求和Json解析都是放在一个类中,服务器返回的respones(result)我用TextView能展示出来,但是为什么传进去是空的
    2018-09-11 19:06:05
  • irista23 回复 提问者 Ygz_ #2
    如果是数据已经请求回来了,证明你联网这块处理是没有问题的,那就从respones(result)这句往下跟踪看看,是什么地方导致传值失败的,如果实在找不到建议你交作业吧,有你的源码就比较容易找到问题,你现在贴的代码补全,还有未使用的代码,不好找原因
    2018-09-12 09:31:40
提问者 Ygz_ 2018-09-11 15:31:57

http://img1.sycdn.imooc.com//climg/5b976f4f0001715511300434.jpg

这里传过来的result怎么是null的呢

irista23 2018-09-11 10:57:36

应该是该方法中有空指针,你检查下传进来的adapter

http://img1.sycdn.imooc.com//climg/5b972e730001e71306610467.jpg

listAdapter是在后面的initView() 方法中初始化的,所以传进来的应该是空的

http://img1.sycdn.imooc.com//climg/5b972eda0001fafc08820773.jpg

  • 提问者 Ygz_ #1
    应该是传过来的List集合是空的
    2018-09-11 11:44:16
  • irista23 回复 提问者 Ygz_ #2
    你也可以断点跟踪下onPostExecute() 方法里,一步一步检查是哪个变量的值为空
    2018-09-11 11:47:45
提问者 Ygz_ 2018-09-11 01:42:17
irista23 2018-09-10 10:02:56

你看下报空指针的地方的提示是什么,先找到相应的代码行,再通过提示具体的信息或跟踪代码找到具体哪个变量报的,跟踪下这个变量查一下是不是没有初始化操作。如果找不到也可以把报错信息贴出来方便我们快速帮你解决~~

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师