老师,我又折腾了一下午,感觉学习效率好低,我该如何保证下载完图片再进行赋值操作

来源:2-4 加载数据到ListView

雎山月

2019-09-08 22:10:45

http://img.mukewang.com/climg/5d750bc70001cce805290941.jpg

RequestDataActivity.java

我这里想利用先生产后消费的思想解决问题,不会闪退,但一条页面数据也没有。

public class RequestDataActivity extends AppCompatActivity {
    private static final String TAG = "RequestDataActivity";
    private ListView mListView;
    public static final int MESSAGE_CODE = 0001;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化控件
        mListView = findViewById(R.id.main_list_view);


        //开启异步请求
        RequestDataAsyncTask dataAsyncTask = new RequestDataAsyncTask(this);
        dataAsyncTask.execute();

    }


    /**
     * 异步网络请求
     */
    public static class RequestDataAsyncTask extends AsyncTask<Void, Void, String> {
        public static final String REQUEST_DATA_URL = "http://www.imooc.com/api/teacher?type=2&page=1";

        private WeakReference<RequestDataActivity> mWeakReference;
        private RequestDataActivity mActivity;
        private Context mContext;



        public RequestDataAsyncTask(RequestDataActivity activity) {
            mWeakReference = new WeakReference<>(activity);
            mContext = activity;
        }

        public static final int REQUEST_TIMEOUT = 5000;
        public static final String STATUS = "status";
        public static final String MSG = "msg";
        public static final String DATA = "data";
        public static final String NAME = "name";
        public static final String PIC_SMALL = "picSmall";

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //loading
            mActivity = mWeakReference.get();
        }

        @Override
        protected String doInBackground(Void... voids) {
            String result = request(REQUEST_DATA_URL);
            Log.i(TAG, "doInBackground: " + result);
            return result;
        }

        /**
         * 原生网络请求
         *
         * @param urlString 网络地址
         * @return json数据
         */
        private String request(String urlString) {
            try {
                URL url = new URL(urlString);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                connection.setConnectTimeout(REQUEST_TIMEOUT);
                connection.setRequestMethod("GET");
                connection.connect();

                int responseCode = connection.getResponseCode();

                if (responseCode == HttpURLConnection.HTTP_OK) {
                    //字符输入流
                    InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream());
                    //缓冲流
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    StringBuilder stringBuilder = new StringBuilder();

                    //单行数据
                    String line;

                    while ((line = bufferedReader.readLine()) != null) {
                        stringBuilder.append(line);
                    }
                    inputStreamReader.close();
                    bufferedReader.close();
                    String result = stringBuilder.toString();
                    return result;
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            // loading 消失,数据处理 刷新界面

            LessonResult mLessonResult = new LessonResult();
            final List<Lesson> mLessonList = new ArrayList<>();

            try {
                JSONObject jsonObject = new JSONObject(s);
                int status = jsonObject.getInt(STATUS);
                mLessonResult.setStatus(status);
                final JSONArray jsonArray = jsonObject.getJSONArray(DATA);

                for (int index = 0; index < jsonArray.length(); index++) {
                    final Lesson lesson = new Lesson();
                    //获取单个JSON对象
                    JSONObject itemJSONObject = (JSONObject) jsonArray.get(index);
                    //设置name值
                    lesson.setName(itemJSONObject.getString(NAME));
                    //获取图片下载地址
                    final String url = itemJSONObject.getString(PIC_SMALL);

                    final Prosumer prosumer = new Prosumer();

                    //生产
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "生产");
                            prosumer.requestGetPic(url);

                        }
                    }).start();
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "消费");
                            prosumer.setRequestPicSmall(mLessonList,lesson);
                        }
                    }).start();
                }
                mLessonResult.setDataList(mLessonList);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            RequestDataAdapter adapter = new RequestDataAdapter(mLessonResult.getDataList(), mContext);
            mActivity.mListView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
        }

    }

}

Prosumer.java

public class Prosumer {
    //是否下载有图片
    private boolean flag;
    private Bitmap mBitmap;

    /**
     * 下载网络图片(生产)
     *
     * @param urlString 图片连接
     * @return 返回Bitmap对象
     */
    public synchronized void requestGetPic(String urlString) {
        //有图片就等待
        if (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            //接受响应码
            int responseCode = connection.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {
                InputStream inputStream = connection.getInputStream();
                mBitmap = BitmapFactory.decodeStream(inputStream);
                //生产完毕 将flag重新赋值
                flag = true;
                //唤醒线程
                notifyAll();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 设置网络图片
     */
    public synchronized  void setRequestPicSmall(List<Lesson> lessonList, Lesson lesson) {
        //没有图片就等待
        if(!flag){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        lesson.setPicSmall(mBitmap);
        lessonList.add(lesson);
        //消费完
        flag = false;
        //唤醒线程
        notifyAll();
    }
}

Lesson.java

public class Lesson {

    private String name;
    private Bitmap picSmall;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Bitmap getPicSmall() {
        return picSmall;
    }

    public void setPicSmall(Bitmap picSmall) {
        this.picSmall = picSmall;
    }

}

LessonResult.java

public class LessonResult {

    private int status;
    List<Lesson> dataList = new ArrayList<>();

    public void setStatus(int status) {
        this.status = status;
    }

    public List<Lesson> getDataList() {
        return dataList;
    }

    public void setDataList(List<Lesson> dataList) {
        this.dataList = dataList;
    }

}



写回答

1回答

好帮手慕雪

2019-09-09

 mBitmap = BitmapFactory.decodeStream(inputStream);后通知一下adapter,调用notifydatasetchanged()就行了。它会自动的刷新UI的。《屏幕适配》也会有对应作业哦,是同样的解决方法。祝:学习愉快

0

0 学习 · 1800 问题

查看课程