谷歌电子市场第2天

来源:互联网 发布:西门子logo编程电缆 编辑:程序博客网 时间:2024/04/29 13:22



一线程池的使用

1.线程池的原理

public class ThreadPool {int maxCount = 3;AtomicInteger count =new AtomicInteger(0);// 当前开的线程数  count=0,atomicInteger可以保持线程同步LinkedList<Runnable> runnables = new LinkedList<Runnable>();public void execute(Runnable runnable) {runnables.add(runnable);if(count.incrementAndGet()<=3){createThread();}}private void createThread() {new Thread() {@Overridepublic void run() {super.run();while (true) {// 取出来一个异步任务if (runnables.size() > 0) {Runnable remove = runnables.remove(0);if (remove != null) {remove.run();}}else{//  等待状态   wake();}}}}.start();}}

2.线程池的使用

public class ThreadManager {private ThreadManager() {}private static ThreadManager manager = new ThreadManager();private ThreadPoolProxy longPool ;private ThreadPoolProxy shortPool ;public static ThreadManager getInstance() {return manager;}/** 操作网络文件的线程*/// cpu的核数*2+1public synchronized ThreadPoolProxy createLongPool() {if (longPool == null) { longPool = new ThreadPoolProxy(5, 5, 5000L);}return longPool;}/** 操作本地文件的线程*/public synchronized ThreadPoolProxy createshortPool() {if (shortPool == null) {shortPool = new ThreadPoolProxy(3, 3, 5000L);}return shortPool;}public class ThreadPoolProxy {private ThreadPoolExecutor pool;private int corePoolSize;private int maximumPoolSize;private long time;public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long time) {this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.time = time;}public void execute(Runnable runnable) {/* * 1.线程池里面管理的线程数2.如果排队满了额外再开的线程数3.如果线程池没有要执行的任务 存活多久4.时间的单位5.如果 * 线程池里管理的线程都已经用了,剩下的任务 临时存到LinkedBlockingQueue对象中 排队10个排队 */if (pool == null) {pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,time, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(10));}pool.execute(runnable);}public void cancel(Runnable runnable) {// 不为null ,没有停止,,没有崩溃if (pool != null && !pool.isShutdown() && !pool.isTerminated()) {pool.remove(runnable);}}}}

二。读取网络数据

1.BaseProtocol

public abstract class BaseProtocol<T> {private FileWriter writer;private BufferedWriter bufferedWriter;private BufferedReader bufferedReader;private JSONArray jsonArray;private T parseJson;public T load(int index) {String json = loadLocal(index);// 1.加载本地数据System.out.println("加载了本地数据");if (json == null) {// 2.没有本地数据,则加载服务器数据json = loadServer(index);// System.out.println(json);if (json != null) {saveLocal(index, json);// 3.保存数据到本地}}if (json != null) {// 4.如果加载到了本地数据,解析parseJson = parseJson(json);return parseJson;} else {return null;}}/** 1.加载本地数据 */private String loadLocal(int index) {File dir = FileUtils.getFilePath("cache");File file = new File(dir, getKey() + index);// 缓存在sdcard/google1/cache文件夹中if (file != null) {try {bufferedReader = new BufferedReader(new FileReader(file));long time = Long.parseLong(bufferedReader.readLine());if (System.currentTimeMillis() - time > 0) {return null;} else {StringWriter stringWriter = new StringWriter();String str;while ((str = bufferedReader.readLine()) != null) {stringWriter.write(str);}return stringWriter.toString();}} catch (Exception e) {e.printStackTrace();return null;} finally {IOUtils.closeQuietly(bufferedReader);}}return null;}/** 2.加载服务器数据 */private String loadServer(int index) {// 这里为什么不用在子线程中运行,因为调用的时候就是在子线程中调用的,用httputils的话里面涉及线程中的线程问题StringBuffer buffer = null;HttpURLConnection connection = null;try {URL url = new URL("http://127.0.0.1:8090/" + getKey() + "?index="+ index + getParams());connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setReadTimeout(8000);connection.setConnectTimeout(8000);connection.connect();if (connection.getResponseCode() == 200) {InputStream stream = connection.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(stream));buffer = new StringBuffer();String line = "";while ((line = reader.readLine()) != null) {buffer.append(line);}}} catch (Exception e) {e.printStackTrace();return null;} finally {if (connection != null) {connection.disconnect();}}return buffer.toString();}private void saveLocal(int index, String json) {try {File dir = FileUtils.getFilePath("cache");File file = new File(dir, getKey() + index);// 缓存在sdcard/google1/cache文件夹中writer = new FileWriter(file);bufferedWriter = new BufferedWriter(writer);bufferedWriter.write(System.currentTimeMillis() + "");bufferedWriter.newLine();bufferedWriter.write(json);bufferedWriter.close();} catch (Exception e) {e.printStackTrace();} finally {IOUtils.closeQuietly(writer);IOUtils.closeQuietly(bufferedWriter);}}public abstract  T parseJson(String json);public abstract String getKey();public abstract String getParams();}
2.获取缓存在本地的路径

public class FileUtils {public static final String URL = "http://127.0.0.1:8090/";private static final String Root = "google1";public static final String ICON = "icon";String path = "";private static StringBuilder stringBuilder;/** * 获取图片的缓存的路径 * @return */public static File getIconDir(){return getFilePath(ICON);}/** * 获取缓存路径 * @return */public static File getCacheDir() {return getFilePath("");}//获取缓存的路径public static File getFilePath(String str) {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {stringBuilder = new StringBuilder();stringBuilder.append(Environment.getExternalStorageDirectory().getAbsolutePath());stringBuilder.append(File.separator);stringBuilder.append(Root);stringBuilder.append(File.separator);stringBuilder.append(str);}else{File filesDir = BaseApplication.getApplication().getFilesDir();stringBuilder.append(filesDir.getAbsolutePath());stringBuilder.append(File.separator);stringBuilder.append(str);}File file = new File(stringBuilder.toString());// 不存在或者不是一个文件夹if (!file.exists() || !file.isDirectory()) {file.mkdirs();}return file;}}
3.HomeProtocol解析数据

public class HomeProtocol extends BaseProtocol<List<Appinfo>>{private JSONArray jsonArray;public List<Appinfo> parseJson(String json) {JSONObject jsonObject;List<Appinfo> appinfos = new ArrayList<Appinfo>();try {jsonObject = new JSONObject(json);jsonArray = jsonObject.getJSONArray("list");for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject2 = jsonArray.getJSONObject(i);long id = jsonObject2.getLong("id");String name = jsonObject2.getString("name");String packageName = jsonObject2.getString("packageName");String iconUrl = jsonObject2.getString("iconUrl");float stars = Float.parseFloat(jsonObject2.getString("stars"));long size = jsonObject2.getLong("size");String downloadUrl = jsonObject2.getString("downloadUrl");String des = jsonObject2.getString("des");Appinfo appinfo = new Appinfo(id, name, packageName, iconUrl,stars, size, downloadUrl, des);appinfos.add(appinfo);}return appinfos;} catch (JSONException e) {e.printStackTrace();return null;}}public String getKey() {return "home";}/** 重写这个后缀,有的有,有的没有,需要的重写 */public String getParams() {return "";}}

4.设置HomeFragment页面

public class HomeFragment extends BaseFragment {private List<Appinfo> data;private ListView listView;private Myadapter myadapter;private BitmapUtils bitmapUtils;// 开始的时候就加载HomeFragment的页面@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);show();}/** 创建了成功的界面 */protected View createSuccessView() {listView = new ListView(BaseApplication.getApplication());myadapter = new Myadapter();// listView.setAdapter(myadapter);return listView;}class Myadapter extends BaseAdapter {@Overridepublic int getCount() {return data.size();}@Overridepublic Object getItem(int position) {return data.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = null;ViewHolder holder;if (convertView == null) {holder = new ViewHolder();view = View.inflate(BaseApplication.getApplication(),R.layout.item_app, null);holder.item_icon = (ImageView) view.findViewById(R.id.item_icon);holder.item_title = (TextView) view.findViewById(R.id.item_title);holder.item_size = (TextView) view.findViewById(R.id.item_size);holder.item_bottom = (TextView) view.findViewById(R.id.item_bottom);holder.item_rating = (RatingBar) view.findViewById(R.id.item_rating);view.setTag(holder);} else {view = convertView;holder = (ViewHolder) view.getTag();}Appinfo appinfo = data.get(position);holder.item_title.setText(appinfo.getName());String formatFileSize = Formatter.formatFileSize(BaseApplication.getApplication(), appinfo.getSize());holder.item_size.setText(formatFileSize);holder.item_bottom.setText(appinfo.getDes());holder.item_rating.setRating(appinfo.getStarts());//http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg// 加载图片String iconUrl = appinfo.getIconUrl();System.out.println(iconUrl+"-------------");bitmapUtils = BitmapHelper.getBitmapUtils();//使用单例模式的BitmapUtils,并且可以缓存到sdcard中bitmapUtils.display(holder.item_icon,"http://127.0.0.1:8090" + "/image?name=" + iconUrl);bitmapUtils.configDefaultLoadingImage(R.drawable.ic_launcher);return view;}} // 获取数据从服务器protected int LoadDataFromServer() {HomeProtocol homeProtocol = new HomeProtocol();data = homeProtocol.load(0);for (Appinfo appinfo : data) {// System.out.println(appinfo.toString());}getActivity().runOnUiThread(new Runnable() {@Overridepublic void run() {listView.setAdapter(myadapter);}});return checkData(data);}static class ViewHolder {ImageView item_icon;TextView item_title;TextView item_size;TextView item_bottom;RatingBar item_rating;}}

5.使用BitmapUtils的方法可以将图片缓存到本地中

public class BitmapHelper {private BitmapHelper() {}private static BitmapUtils bitmapUtils;/** * BitmapUtils不是单例的 根据需要重载多个获取实例的方法 *  * @param appContext *            application context * @return */public static BitmapUtils getBitmapUtils() {if (bitmapUtils == null) {// 第二个参数 缓存图片的路径 // 加载图片 最多消耗多少比例的内存 0.05-0.8fbitmapUtils = new BitmapUtils(UiUtils.getContext(), FileUtils.getIconDir().getAbsolutePath(), 0.3f);}return bitmapUtils;}}

6.设置ListView的细节处理

## BaseListView public class BaseListView extends ListView {public BaseListView(Context context) {super(context);init();}public BaseListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public BaseListView(Context context, AttributeSet attrs) {super(context, attrs);init();}private void init() {//setSelector  点击显示的颜色//setCacheColorHint  拖拽的颜色//setDivider  每个条目的间隔的分割线this.setSelector(R.drawable.nothing);  // 什么都没有this.setCacheColorHint(R.drawable.nothing);this.setDivider(UiUtils.getDrawalbe(R.drawable.nothing));}}

0 0