为了账号安全,请及时绑定邮箱和手机立即绑定

正在回答

3 回答

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://www.imooc.com/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对应的数据转换成我们封装的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);

}

}


}



0 回复 有任何疑惑可以回复我~
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,创建Cache;
	private LruCache<String, Bitmap> mCaches;
	private ListView mListView;
	private Set<NewsAsyncTask> mTask;

	public ImageLoader(ListView listView) {
		mListView = listView;
		mTask = new HashSet<NewsAsyncTask>();
		// 获取最大内存
		int maxMemory = (int) Runtime.getRuntime().maxMemory();
		int cacheSize = maxMemory / 4;
		mCaches = new LruCache<String, Bitmap>(cacheSize) {
			@Override
			protected int sizeOf(String key, Bitmap value) {
				// 在每次存入缓存的时候调用
				return value.getByteCount();
			}
		};
	}

	/**
	 * 增加到缓存
	 */
	public void addBitmapToCache(String url, Bitmap bitmap) {
		if (getBitmapFromCache(url) == null) {
			mCaches.put(url, bitmap);
		}
	}

	/**
	 * 从缓存中获取数据
	 */
	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;
	}

	/**
	 * 通过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];
				// 从网络下载图片
				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);
				}
			}
		}
	
}


0 回复 有任何疑惑可以回复我~
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) {
			//加载可见项
			mImageLoader.loadImages(mStart, mEnd);
		}else{
			//停止任务
			mImageLoader.cancleAllTasks();
		}
		
	}
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		mStart = firstVisibleItem;
		mEnd = firstVisibleItem+visibleItemCount;
		//第一次显示时候调用
		if (mFirstIn && visibleItemCount>0) {
			mImageLoader.loadImages(mStart, mEnd);
			mFirstIn =false;
		}
	}
}


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android必学-异步加载
  • 参与学习       50614    人
  • 解答问题       333    个

了解Android中的异步加载处理方法,这是面试问的最多的知识点

进入课程

源碼?。。。。。

我要回答 关注问题
微信客服

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

帮助反馈 APP下载

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

公众号

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