課程
/移動(dòng)開(kāi)發(fā)
/Android
/Android必學(xué)-異步加載
老師,沒(méi)有下載呢?
2015-06-14
源自:Android必學(xué)-異步加載 5-1
正在回答
package com.example.news;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends Activity {
private ListView mListView;
private static String URL = "http://idcbgp.cn/api/teacher?type=4&num=30";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.lv_main);
// new NewsAsyncTask().execute(URL);
}
/**
?* 將URL對(duì)應(yīng)的數(shù)據(jù)轉(zhuǎn)換成我們封裝的NewsBean;
?* @param url
?* @return
?*/
private List<NewsBean> getJsonData(String url) {
? ? ? ?List<NewsBean> NewsBeanList = new ArrayList<NewsBean>();
? ? ? ?try {
? ? ? ? ? ?String JsonString = readStream(new URL(url).openStream());
? ? ? ? ? ?// ?Log.d("xys", JsonString);
? ? ? ? ? ?JSONObject jsonObject ;
? ? ? ? ? ?NewsBean newsBean;
? ? ? ? ? ?try {
? ? ? ? ? ? jsonObject = new JSONObject(JsonString);
? ? ? ? ? ? JSONArray jsonArray = jsonObject.getJSONArray("data");
? ? ? ? ? ? for (int i=0; i<jsonArray.length() ; i++) {
? ? ? ? ? ? jsonObject = jsonArray.getJSONObject(i);
newsBean = new NewsBean();
newsBean.newsIconUrl = jsonObject.getString("picSmall");
newsBean.newsTitle = jsonObject.getString("name");
newsBean.newsContent = jsonObject.getString("description");
NewsBeanList.add(newsBean);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} ??
? ? ? ? ? ?} catch (IOException e) {
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?return NewsBeanList;
? ?}
private String readStream(InputStream is) {
InputStreamReader isr;
String result = "";
try {
String line = "";
isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
result += line;
} catch (Exception e) {
return result;
class NewsAsyncTask extends AsyncTask<String, Void, List<NewsBean>> {
protected List<NewsBean> doInBackground(String... params) {
return getJsonData(params[0]);
protected void onPostExecute(List<NewsBean> newsBean) {
super.onPostExecute(newsBean);
NewsAdapter adapter = new NewsAdapter(MainActivity.this, newsBean,mListView);
mListView.setAdapter(adapter);
package?com.example.news; import?java.io.BufferedInputStream; import?java.io.IOException; import?java.io.InputStream; import?java.net.HttpURLConnection; import?java.net.URL; import?java.util.HashSet; import?java.util.Set; import?android.graphics.Bitmap; import?android.graphics.BitmapFactory; import?android.os.AsyncTask; import?android.os.Handler; import?android.os.Message; import?android.support.v4.util.LruCache; import?android.widget.ImageView; import?android.widget.ListView; public?class?ImageLoader?{ private?String?mUrl; private?ImageView?mImageView; //?使用Lru,創(chuàng)建Cache; private?LruCache<String,?Bitmap>?mCaches; private?ListView?mListView; private?Set<NewsAsyncTask>?mTask; public?ImageLoader(ListView?listView)?{ mListView?=?listView; mTask?=?new?HashSet<NewsAsyncTask>(); //?獲取最大內(nèi)存 int?maxMemory?=?(int)?Runtime.getRuntime().maxMemory(); int?cacheSize?=?maxMemory?/?4; mCaches?=?new?LruCache<String,?Bitmap>(cacheSize)?{ @Override protected?int?sizeOf(String?key,?Bitmap?value)?{ //?在每次存入緩存的時(shí)候調(diào)用 return?value.getByteCount(); } }; } /** ?*?增加到緩存 ?*/ public?void?addBitmapToCache(String?url,?Bitmap?bitmap)?{ if?(getBitmapFromCache(url)?==?null)?{ mCaches.put(url,?bitmap); } } /** ?*?從緩存中獲取數(shù)據(jù) ?*/ public?Bitmap?getBitmapFromCache(String?url)?{ return?mCaches.get(url); } private?Handler?handler?=?new?Handler()?{ @Override public?void?handleMessage(Message?msg)?{ super.handleMessage(msg); if?(mImageView.getTag().equals(mUrl))?{ mImageView.setImageBitmap((Bitmap)?msg.obj); } } }; public?void?showImageByThread(ImageView?imageView,?final?String?url)?{ mUrl?=?url; mImageView?=?imageView; new?Thread()?{ @Override public?void?run()?{ super.run(); Bitmap?bitmap?=?getBitmapFromUrl(url); Message?message?=?Message.obtain(); message.obj?=?bitmap; handler.sendMessage(message); } }.start(); } public?Bitmap?getBitmapFromUrl(String?urlString)?{ Bitmap?bitmap; InputStream?is?=?null; try?{ URL?url?=?new?URL(urlString); HttpURLConnection?conn?=?(HttpURLConnection)?url.openConnection(); is?=?new?BufferedInputStream(conn.getInputStream()); bitmap?=?BitmapFactory.decodeStream(is); conn.disconnect(); //?Thread.sleep(1000); return?bitmap; }?catch?(Exception?e)?{ e.printStackTrace(); }?finally?{ try?{ is.close(); }?catch?(IOException?e)?{ e.printStackTrace(); } } return?null; } /** ?*?通過(guò)AsyncTask加載圖片 ?*/ public?void?showImageByAsyncTask(ImageView?imageView,?String?url)?{ Bitmap?bitmap?=?getBitmapFromCache(url); if?(bitmap?==?null)?{ imageView.setImageResource(R.drawable.ic_launcher); }?else?{ imageView.setImageBitmap(bitmap); } } public?void?loadImages(int?start,?int?end)?{ for?(int?i?=?start;?i?<?end;?i++)?{ String?url?=?NewsAdapter.URLS[i]; Bitmap?bitmap?=?getBitmapFromCache(url); if?(bitmap?==?null)?{ NewsAsyncTask?task?=?new?NewsAsyncTask(url); task.execute(url); mTask.add(task); }?else?{ ImageView?imageView?=?(ImageView)?mListView .findViewWithTag(url); imageView.setImageBitmap(bitmap); } } } class?NewsAsyncTask?extends?AsyncTask<String,?Void,?Bitmap>?{ private?String?mUrl; //private??ImageView?mImageView; public?NewsAsyncTask(String?url)?{ //?mImageView?=?imageView; mUrl?=?url; } @Override protected?Bitmap?doInBackground(String...?params)?{ String?url?=?params[0]; //?從網(wǎng)絡(luò)下載圖片 Bitmap?bitmap?=?getBitmapFromUrl(url); if?(bitmap?!=?null)?{ //?將不在緩存的加入緩存 addBitmapToCache(url,?bitmap); } return?bitmap; } @Override protected?void?onPostExecute(Bitmap?bitmap)?{ super.onPostExecute(bitmap); //?if?(mImageView.getTag().equals(mUrl))?{ //?mImageView.setImageBitmap(result); ImageView?imageView?=?(ImageView)?mListView .findViewWithTag(mUrl); if?(imageView!=null?&&?bitmap!=null)?{ imageView.setImageBitmap(bitmap); } mTask.remove(this); } } public?void?cancleAllTasks()?{ if?(mTask?!=null)?{ for?(NewsAsyncTask?task?:?mTask)?{ task.cancel(false); } } } }
package?com.example.news; import?java.util.List; import?android.content.Context; import?android.view.LayoutInflater; import?android.view.View; import?android.view.ViewGroup; import?android.widget.AbsListView; import?android.widget.AbsListView.OnScrollListener; import?android.widget.BaseAdapter; import?android.widget.ImageView; import?android.widget.ListView; import?android.widget.TextView; public?class?NewsAdapter?extends?BaseAdapter?implements?OnScrollListener{ private?List<NewsBean>?mList; private?LayoutInflater?mInflater; private?ImageLoader?mImageLoader; private?int?mStart,mEnd; public??static?String[]?URLS; private?boolean?mFirstIn; public?NewsAdapter(Context?context,List<NewsBean>?data,ListView?listView)?{ mList?=?data; mInflater?=?LayoutInflater.from(context); mImageLoader?=?new?ImageLoader(listView); URLS?=?new?String[data.size()]; for?(int?i?=?0;?i?<?data.size();?i++)?{ URLS[i]=data.get(i).newsIconUrl; } mFirstIn?=true; listView.setOnScrollListener(this); } @Override public?int?getCount()?{ //?TODO?Auto-generated?method?stub return?mList.size(); } @Override public?Object?getItem(int?position)?{ //?TODO?Auto-generated?method?stub return?mList.get(position); } @Override public?long?getItemId(int?position)?{ //?TODO?Auto-generated?method?stub return?position; } @Override public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{ ViewHolder?holder=null; if?(convertView?==null)?{ ?holder?=?new?ViewHolder(); convertView?=?mInflater.inflate(R.layout.item_layout,?null); holder.tvTitle?=?(TextView)?convertView.findViewById(R.id.tv_title); holder.tvContent=(TextView)?convertView.findViewById(R.id.tv_content); holder.ivIcon?=?(ImageView)?convertView.findViewById(R.id.iv_icon); ?convertView.setTag(holder); }else{ holder?=?(ViewHolder)?convertView.getTag(); } String?url?=?mList.get(position).newsIconUrl; //holder.ivIcon.setImageResource(R.drawable.ic_launcher); holder.ivIcon.setTag(url); //new?ImageLoader().showImageByThread(holder.ivIcon,url); mImageLoader.showImageByAsyncTask(holder.ivIcon,url); holder.tvTitle.setText(mList.get(position).newsTitle); holder.tvContent.setText(mList.get(position).newsContent); return?convertView; } class?ViewHolder{ public?TextView?tvTitle; public?TextView?tvContent; public?ImageView?ivIcon; } @Override public?void?onScrollStateChanged(AbsListView?view,?int?scrollState)?{ if?(scrollState==SCROLL_STATE_IDLE)?{ //加載可見(jiàn)項(xiàng) mImageLoader.loadImages(mStart,?mEnd); }else{ //停止任務(wù) mImageLoader.cancleAllTasks(); } } @Override public?void?onScroll(AbsListView?view,?int?firstVisibleItem, int?visibleItemCount,?int?totalItemCount)?{ //?TODO?Auto-generated?method?stub mStart?=?firstVisibleItem; mEnd?=?firstVisibleItem+visibleItemCount; //第一次顯示時(shí)候調(diào)用 if?(mFirstIn?&&?visibleItemCount>0)?{ mImageLoader.loadImages(mStart,?mEnd); mFirstIn?=false; } } }
舉報(bào)
了解Android中的異步加載處理方法,這是面試問(wèn)的最多的知識(shí)點(diǎn)
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2016-01-10
package com.example.news;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;
import java.net.URL;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends Activity {
private ListView mListView;
private static String URL = "http://idcbgp.cn/api/teacher?type=4&num=30";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.lv_main);
// new NewsAsyncTask().execute(URL);
}
/**
?* 將URL對(duì)應(yīng)的數(shù)據(jù)轉(zhuǎn)換成我們封裝的NewsBean;
?* @param url
?* @return
?*/
private List<NewsBean> getJsonData(String url) {
? ? ? ?List<NewsBean> NewsBeanList = new ArrayList<NewsBean>();
? ? ? ?try {
? ? ? ? ? ?String JsonString = readStream(new URL(url).openStream());
? ? ? ? ? ?// ?Log.d("xys", JsonString);
? ? ? ? ? ?JSONObject jsonObject ;
? ? ? ? ? ?NewsBean newsBean;
? ? ? ? ? ?try {
? ? ? ? ? ? jsonObject = new JSONObject(JsonString);
? ? ? ? ? ? JSONArray jsonArray = jsonObject.getJSONArray("data");
? ? ? ? ? ? for (int i=0; i<jsonArray.length() ; i++) {
? ? ? ? ? ? jsonObject = jsonArray.getJSONObject(i);
newsBean = new NewsBean();
newsBean.newsIconUrl = jsonObject.getString("picSmall");
newsBean.newsTitle = jsonObject.getString("name");
newsBean.newsContent = jsonObject.getString("description");
NewsBeanList.add(newsBean);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} ??
? ? ? ? ? ?} catch (IOException e) {
? ? ? ? ? ?e.printStackTrace();
? ? ? ?}
? ? ? ?return NewsBeanList;
? ?}
private String readStream(InputStream is) {
InputStreamReader isr;
String result = "";
try {
String line = "";
isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
class NewsAsyncTask extends AsyncTask<String, Void, List<NewsBean>> {
protected List<NewsBean> doInBackground(String... params) {
return getJsonData(params[0]);
}
@Override
protected void onPostExecute(List<NewsBean> newsBean) {
super.onPostExecute(newsBean);
NewsAdapter adapter = new NewsAdapter(MainActivity.this, newsBean,mListView);
mListView.setAdapter(adapter);
}
}
}
2016-01-10
2016-01-10