package com.itheima.netimageviewer; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.res.Resources.Theme; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { protected static final int LOAD_IMAGE = 1; protected static final int LOAD_ERROR = 2; // 服务器所有图片的路径 private List<String> paths; private ImageView iv; /** * 当前的位置 */ private int currentPosition = 0; //1.创建一个消息处理器 private Handler handler = new Handler(){ //3.处理消息 public void handleMessage(Message msg) { switch (msg.what) { case LOAD_IMAGE: Bitmap bitmap = (Bitmap) msg.obj; iv.setImageBitmap(bitmap); break; case LOAD_ERROR: Toast.makeText(getApplicationContext(), (String)msg.obj, 0).show(); break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); // 1.连接服务器 获取所有的图片的目录信息 loadAllImagePath(); } /** * 开始加载图标,在从服务器获取完毕资源路径之后执行 */ private void beginLoadImage() { // TODO:把每个图片的路径获取出来, 通过路径加载图片. try { paths = new ArrayList<String>(); File file = new File(getCacheDir(), "info.txt"); FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String line; while ((line = br.readLine()) != null) { paths.add(line); } fis.close(); // 2.加载图片资源 loadImageByPath(paths.get(currentPosition)); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 通过路径获取图片资源 * * @param path * 图片的路径 * @return */ private void loadImageByPath(final String path) { new Thread() { public void run() { try { Thread.sleep(2000); // 判断缓存是否存在,如果存在就那缓存图片,如果不存在才去获取服务器的资源 File file = new File(getCacheDir(), path.replace("/", "") + ".jpg"); if (file.exists() && file.length() > 0) { System.out.println("通过缓存把图片资源获取出来...."); // 缓存存在 //iv.setImageBitmap( BitmapFactory.decodeFile(file.getAbsolutePath())); //2.子线程想去更新ui,发送消息 Message msg = Message.obtain(); msg.what = LOAD_IMAGE; msg.obj = BitmapFactory.decodeFile(file.getAbsolutePath()); handler.sendMessage(msg); } else { System.out.println("通过访问网络把图片资源获取出来...."); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setRequestMethod("GET"); int code = conn.getResponseCode(); if (code == 200) { InputStream is = conn.getInputStream(); // 内存中的图片 Bitmap bitmap = BitmapFactory.decodeStream(is); // 如果图片被下载完毕了,应该把图片缓存起来. // CompressFormat.JPEG 压缩的方式 png jpg // 100 压缩比例 100 无损压缩 // stream 把图片写入到哪个缓存流里面 FileOutputStream stream = new FileOutputStream(file); bitmap.compress(CompressFormat.JPEG, 100, stream); stream.close(); is.close(); Message msg = Message.obtain(); msg.obj = bitmap; msg.what = LOAD_IMAGE; handler.sendMessage(msg); //iv.setImageBitmap(bitmap); } else { //Toast.makeText(MainActivity.this, "获取失败", 0).show(); Message msg = Message.obtain(); msg.what = LOAD_ERROR; msg.obj = "获取失败"; handler.sendMessage(msg); } } } catch (Exception e) { e.printStackTrace(); Toast.makeText(MainActivity.this, "获取失败", 0).show(); Message msg = Message.obtain(); msg.what = LOAD_ERROR; msg.obj = "获取失败"; handler.sendMessage(msg); } }; }.start(); } /** * 获取全部图片资源的路径 */ private void loadAllImagePath() { new Thread() { public void run() { // 浏览器发送一个get请求就可以把服务器的数据获取出来. // 用代码模拟一个http的get请求 try { // 1.得到服务器资源的路径 URL url = new URL("http://192.168.1.109:8080/img/gaga.html"); // 2.通过这个路径打开浏览器的连接. HttpURLConnection conn = (HttpURLConnection) url .openConnection();// ftp // http // https // rtsp // 3.设置请求方式为get请求 conn.setRequestMethod("GET");// 注意get只能用大写 不支持小写 // 为了有一个更好的用户ui提醒,获取服务器的返回状态码 int code = conn.getResponseCode();// 200 ok 404资源没有找到 503 // 服务器内部错误 if (code == 200) { // 4.获取服务器的返回的流 InputStream is = conn.getInputStream(); File file = new File(getCacheDir(), "info.txt"); FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } is.close(); fos.close(); beginLoadImage(); } else if (code == 404) { Message msg = Message.obtain(); msg.what = LOAD_ERROR; msg.obj = "获取失败,资源没有找到"; handler.sendMessage(msg); //Toast.makeText(MainActivity.this, "获取失败,资源没有找到", 0).show(); } else { //Toast.makeText(MainActivity.this, "服务器异常", 0).show(); Message msg = Message.obtain(); msg.what = LOAD_ERROR; msg.obj = "服务器异常"; handler.sendMessage(msg); } } catch (Exception e) { e.printStackTrace(); //Toast.makeText(MainActivity.this, "获取失败", 0).show(); Message msg = Message.obtain(); msg.what = LOAD_ERROR; msg.obj = "获取失败"; handler.sendMessage(msg); } }; }.start(); } /** * 上一张 * * @param view */ public void pre(View view) { currentPosition--; if (currentPosition < 0) { currentPosition = paths.size() - 1; } loadImageByPath(paths.get(currentPosition)); } /** * 下一张 * * @param view */ public void next(View view) { currentPosition++; if (currentPosition == paths.size()) { currentPosition = 0; } loadImageByPath(paths.get(currentPosition)); } }
添加权限
<uses-permission android:name="android.permission.INTERNET"/>