我觉得我这个逻辑没有问题,但是无法显示那个菜品详情

我觉得我这个逻辑没有问题,但是无法显示那个菜品详情

我设定的是点击back按钮,就运行异步操作显示菜品信息,具体代码如下:

package com.lexieluv.homeworkthirteenth;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.lexieluv.homeworkthirteenth.adapter.MyAdapter;
import com.lexieluv.homeworkthirteenth.entity.DetailBean;
import com.lexieluv.homeworkthirteenth.entity.FoodBean;
import com.lexieluv.homeworkthirteenth.util.JsonUtils;
import com.lexieluv.homeworkthirteenth.util.NetUtils;

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

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import image.SmartImage;
import image.SmartImageView;

import static com.lexieluv.homeworkthirteenth.util.JsonUtils.parseJson;

public class FoodActivity extends AppCompatActivity {
    private TextView name;
    private SmartImageView img;
    private TextView originalprice;
    private TextView tPrice;
    private TextView price;
    private TextView description;

    private ImageView back;
    int i = 1;
    String u = "http://www.imooc.com/api/shopping?type=12";

    @Override
    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        setContentView(R.layout.description);
        init();

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AsynctaskSecond(FoodActivity.this).execute();
                Log.d("**************", String.valueOf(i));
                i++;
            }
        });
    }

    //在主线程初始化绑定
    private void init() {
        name = findViewById(R.id.tv_title_second);
        img = findViewById(R.id.iv_food_second);
        originalprice = findViewById(R.id.tv_price_first);
        tPrice = findViewById(R.id.tv_price_second);
        price = findViewById(R.id.tv_price_third);
        description = findViewById(R.id.tv_description);
        back = findViewById(R.id.back_main);
    }


    //异步任务类下载网络数据的类
    class AsynctaskSecond extends AsyncTask<Void, Integer, Boolean> {
        Context context;
        AsynctaskSecond(Context context){
            this.context = context;
        }
        @Override
        protected Boolean doInBackground(Void... voids) {
            return true;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            Gson g = new Gson();
            DetailBean detailBean = g.fromJson(Net.getData(u).toString(),DetailBean.class);
            name.setText(detailBean.getName());
            img.setImageUrl(detailBean.getImg());
            originalprice.setText(String.valueOf(detailBean.getOriginalprice()));
            tPrice.setText(detailBean.getTPrice());
            price.setText(detailBean.getPrice());
            description.setText(detailBean.getDescription());
        }

    }
}

class Net{
    public static StringBuilder getData(String urlString) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        StringBuilder response = null;
        try {
            URL url = new URL(urlString);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(8000);
            connection.setReadTimeout(8000);
            InputStream in = connection.getInputStream();
            //对获取的输入流进行读取
            reader = new BufferedReader(new InputStreamReader(in));
            response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                connection.disconnect();
            }
        }
        return response;
    }
}


正在回答

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

3回答

你这啥都没做,你让它显示啥呀?

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

  • LexieMIZUKI 提问者 #1
    老师我又换了一个方式写,请看上面。
    2019-05-29 21:05:23
提问者 LexieMIZUKI 2019-05-29 21:06:54

我发现jsonString的内容是可以打印出来的,但是不知道是不是因为只有一条object,所以打印jsonArray的length的时候,什么也没有显示,按道理应该显示1。

package com.lexieluv.homeworkthirteenth;

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.lexieluv.homeworkthirteenth.adapter.DetailAdapter;
import com.lexieluv.homeworkthirteenth.entity.DetailBean;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class FoodActivity extends AppCompatActivity {
    ImageView back;
    static String url = "http://www.imooc.com/api/shopping?type=12";
    ListView no;
    int i = 0;

    @Override
    public void onCreate(Bundle savedInstance) {
        super.onCreate(savedInstance);
        setContentView(R.layout.no);
        back = findViewById(R.id.back_main);
        no = findViewById(R.id.no);
//        AsynctaskSecond asyncTask = new AsynctaskSecond(FoodActivity.this,no);
//        asyncTask.execute(u);

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AsynctaskSecond(FoodActivity.this,no).execute(url);
                Log.d("**************", String.valueOf(i));
                i++;
            }
        });
    }
}

//异步任务类下载网络数据的类
class AsynctaskSecond extends AsyncTask<String, Void, List<DetailBean>> {
    //传入一个context,为了Myadapter的执行
    private Context context;
    ListView no;

    public AsynctaskSecond(Context context,ListView no) {
        super();
        this.context=context;
        this.no = no;
    }

    //将URL对应的JSON格式数据转化为我们所封装的DetailBean对象
    private List<DetailBean> getJsonData(String url) {
        List<DetailBean> list=new ArrayList<DetailBean>();
        try {
            String jsonString=readStream(new URL(url).openStream());
            //调试是否返回正确json格式的数据字符串
            Log.i("info2", "getJsonData:"+jsonString);
            JSONObject jsonObject;
            DetailBean detailBean;

            //通过传入json格式的数据字符串,用JSON内置函数解析字符串,得到json数据
            jsonObject=new JSONObject(jsonString);
            Log.d("***************333", jsonObject.toString());
            //data就是我们在浏览器看到的data数组,不要把data写成了date,刚就犯了这个错,获取不到数据
            JSONArray jsonArray=jsonObject.getJSONArray("data");
            Log.d("***************111", String.valueOf(jsonArray.length()));
            //得到整个data数组后,我们就可以通过遍历数组,得到数组里每个一个对象的值
            for(int i=0;i<=jsonArray.length();i++){
                jsonObject =jsonArray.getJSONObject(i);
                detailBean=new DetailBean();
                detailBean.setName(jsonObject.getString("name"));
                detailBean.setDescription(jsonObject.getString("description"));
                detailBean.setOriginalprice(Double.parseDouble(jsonObject.getString("originalprice")));
                detailBean.setPrice(jsonObject.getString("price"));
                detailBean.setTPrice(Integer.parseInt(jsonObject.getString("tPrice")));
                detailBean.setImg(jsonObject.getString("img"));
                list.add(detailBean);
            }


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }catch (JSONException e) {

            e.printStackTrace();
        }
        return list;
    }

    //通过URL获取网页返回的字符串信息
    private String readStream(InputStream is)
    {
        InputStreamReader isr;
        String result="";
        //一次性将URL的所有JSON格式数据都截取,赋值到result
        //获取的是一个JSON加密的格式,在浏览器访问的时候,系统会自动将乱码格式转换了正常的格式
        try {
            String line="";
            isr=new InputStreamReader(is,"utf-8");
            BufferedReader br=new BufferedReader(isr);
            while((line=br.readLine())!=null){
                result+=line;
                Log.i("info1", "line:"+line);
                Log.i("info1", "result:"+result);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
        return result;

    }

    @Override
    protected List<DetailBean> doInBackground(String... params) {
        return getJsonData(params[0]);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(List<DetailBean> list) {
        super.onPostExecute(list);
        DetailAdapter adapter=new DetailAdapter(context,list);
        no.setAdapter(adapter);
        Log.d("***************2",list.toString());
    }
}


  • 1)你去 getJsonData()中打印一下jsonArray.length()。2)你去onPostExecute()中打印一下list的长度。 如果这两处都能正确的打印出它的长度为1的话,你再去排查一下DetailAdapter
    2019-05-30 09:40:02
  • 提问者 LexieMIZUKI 回复 好帮手慕雪 #2
    这两个地方我都打印过了,都不能jsonarray和list的长度都没有打印出来
    2019-05-30 13:43:41
  • 提问者 LexieMIZUKI 回复 好帮手慕雪 #3
    我在以前做的一个类似的项目作业中相似的地方打印都可以出来,唯一的区别就是那一个的有很多个,但这个就只有一组数据。
    2019-05-30 13:45:35
好帮手慕雪 2019-05-29 16:09:44

tPrice,name等显示的都正常,只有description没有数据吗?那你看一下DetailBean中的description字段是不是写错了。祝:学习愉快

  • 提问者 LexieMIZUKI #1
    不是,是所有的都不能显示
    2019-05-29 16:40:41
  • 好帮手慕雪 回复 提问者 LexieMIZUKI #2
    下次把报错信息贴上来。程序报错了,并不是没有报错,注意看AS中的log
    2019-05-30 14:24:34
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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