练手小项目之新闻类(1)联网

最近培训安卓阶段快要结束了,也拿了个项目教我们做,其实我想提醒大家,既然是练手项目,就有他的意义。

 就拿我前一篇天气教程,一个简单的APP也有难点,比如数据持久化,图片缓存。多多练手也对于我们这些初级开发者有着重要的意义。

因为只是一个练手项目,页面做的很丑,但是其中含有很多技术点。 

1.Fastjson 解析

2.联网工具内自带线程范问

3.广告栏

4.图片缓存

5.数据持久化-保存到本地

 

我这一节讲解的是联网工具类。我知道联网工具类,有很多,HttpconnectionhttpclientXutilsvolleyansy—http

如果前两种因为是初级封装,只是将联网加入,像后面三种都是自己开了线程or 线程池去联网。所以大家在用用后三种是不用考虑是不是在主线程。前两种得自己开启线程了。

我现在要写的就是第四层  

 

 

第一层封装就是只是将Http的联网封装进了一个类,但是返回的是一个流,而我们需要的是一个String类型的字符床

 

 

 

第二层就是将输入流转字符串加进入了 也就是用bufferread进行转 输出String,这个时候基本已经满足了我们的需求了,但是还要为了他单独开线程这样不好。

第三层 加入线程池 进行联网 handler.post发送结果,用借口回调给调用者

第四层加入 访问图片


慢慢来,特别是接口回调


1. // 使用线程池来下载图片,同一时刻,最多有3个线程在运行
    private static ExecutorService execuotrs = Executors.newFixedThreadPool(3);
会得到一个 execuotrsService对象 注意的是 通过对象会执行 线程操作


2.建立接口,并作为参数 ,回调数据

    public interface OnNetWorkResponse {
        public void ok(String response);

        public void error(String error);
    }

3.接着就是联网

URL url = new URL(path);
                    HttpURLConnection connection = (HttpURLConnection) url
                            .openConnection();
                    connection.setConnectTimeout(5000);
                    connection.setDoInput(true);
                    connection.connect();




4.输入流转String

if (connection.getResponseCode() == 200) {
                        inputStream = connection.getInputStream();
                        outStream = new ByteArrayOutputStream();

                        byte[] b = new byte[1024];
                        int len = 0;
                        while ((len = inputStream.read(b)) != -1) {
                            outStream.write(b, 0, len);
                        }
                        outStream.flush();
                        final String result = new String(
                                outStream.toByteArray());

5.用handler发送消息回去


6.调用的话只需要将接口实例化就行了

HttpUtils.RequestNetWork(AppURLFinal.URL_NAVIGATION,
				new OnNetWorkResponse() {

					@Override
					public void ok(String response) {

同理,访问图片也就是将 流转成了位图

final Bitmap bitmap = BitmapFactory
                                .decodeStream(inputStream);



HttpUtils

package com.example.android20_lzhxw.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.ByteOrder;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;

/**
 * 封装的 网络 + 线程
 */
public class HttpUtils {

	// 使用线程池来下载图片,同一时刻,最多有3个线程在运行
	private static ExecutorService execuotrs = Executors.newFixedThreadPool(3);

	interface OnBitmapNetWorkResponse {
		public void ok(Bitmap bitmap);

		public void error(String error);
	}

	public static void RequestBitmapNetWork(final String path,
			final OnBitmapNetWorkResponse response) {
		
		final Handler handler = new Handler();

		execuotrs.execute(new Runnable() {
			@Override
			public void run() {
				boolean isNetWorkOK = false;
				try {
					URL url = new URL(path);
					HttpURLConnection openConnection = (HttpURLConnection) url
							.openConnection();
					openConnection.setConnectTimeout(5000);
					openConnection.connect();
					if (openConnection.getResponseCode() == 200) {
						InputStream inputStream = openConnection
								.getInputStream();
						final Bitmap bitmap = BitmapFactory
								.decodeStream(inputStream);

						handler.post(new Runnable() {

							@Override
							public void run() {
								response.ok(bitmap);
							}
						});

						inputStream.close();
						isNetWorkOK = true;
					}

				} catch (MalformedURLException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					if (!isNetWorkOK) {
						handler.post(new Runnable() {

							@Override
							public void run() {
								response.error("服务器不在服务区内!");
							}
						});

					}

				}

			}
		});
	}

	public interface OnNetWorkResponse {
		public void ok(String response);

		public void error(String error);
	}

	public static void RequestNetWork(final String path,
			final OnNetWorkResponse response) {
		//实例化handler 
		final Handler hanlder = new Handler();

		new Thread() {
			public void run() {
				//标志位
				boolean isWorkOK = false;
				
				InputStream inputStream = null;
				ByteArrayOutputStream outStream = null;
				try {
					URL url = new URL(path);
					HttpURLConnection connection = (HttpURLConnection) url
							.openConnection();
					connection.setConnectTimeout(5000);
					connection.setDoInput(true);
					connection.connect();

					if (connection.getResponseCode() == 200) {
						inputStream = connection.getInputStream();
						outStream = new ByteArrayOutputStream();

						byte[] b = new byte[1024];
						int len = 0;
						while ((len = inputStream.read(b)) != -1) {
							outStream.write(b, 0, len);
						}
						outStream.flush();
						final String result = new String(
								outStream.toByteArray());

						hanlder.post(new Runnable() {

							@Override
							public void run() {
								response.ok(result);
							}
						});

						isWorkOK = true;
					}

				} catch (MalformedURLException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					// 网络操作出问题
					if (!isWorkOK) {
						response.error("服务器走神拉!");
					}

					if (inputStream != null) {
						try {
							inputStream.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
					if (outStream != null) {
						try {
							outStream.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}

			};
		}.start();

	}

}


你可能感兴趣的:(练手小项目之新闻类(1)联网)