老师,我又折腾了一下午,感觉学习效率好低,我该如何保证下载完图片再进行赋值操作
来源:2-4 加载数据到ListView
雎山月
2019-09-08 22:10:45

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的。《屏幕适配》也会有对应作业哦,是同样的解决方法。祝:学习愉快
相似问题