案例 欢迎界面
一、案例描述
1、考核知识点
Handler消息机制原理
HttpURLConnection
广播接收者的创建与注册
2、练习目标
Ø 使用HttpURLConnection访问服务器
Ø 保存服务器的图片到SD卡
3、需求分析
基本所有APP在打开时第一眼看到的都是一张欢迎图片,在显示3S左右就会进入主界面,这个欢迎界面也有广告的形式,比如腾讯新闻、头条新闻等APP在打开应用时都会显示一张广告图片,并且这张图片是时时更换的,说明获取的都是服务器中的图片。接下来就仿照这些应用的设计制作可以更换图片的欢迎界面。
4、设计思路(实现原理)
1) 每次打开应用都访问服务器,把服务器中指定的图片保存至本地SD卡中
2) 如果SD卡保存有图片,打开应用时就加载SD卡中的图片,如果服务器图片发生变化,
3) 在第二次打开应用时,欢迎界面则加载最新的图片。
二、案例实现
(1)欢迎界面程序
创建“欢迎界面”程序,首先创建WelcomeActivity.java用于处理主要逻辑信息,该程序的界面只有一个ImageView用于显示服务器图片,需要先在res/drawable-hdpi 目录下放置一张图片,如图所示。

MainActivity界面对应的布局文件(welcome.xml)如下所示:
<?xml version="1.0"encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_welcome"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/default" />
</RelativeLayout>
在布局文件中,为ImageView添加一张默认图片,如果SD卡没有图片或者图片加载慢的情况下先显示默认图片。
(2)WelcomeActivity.java
WelcomeActivity.java用于获取网络上的图片,具体代码如下:
1 public class WelcomeActivityextends Activity {
2 protected static final int CHANGE_UI = 1;
3 protected static final int ERROR = 2;
4 private static final String BITMAPADDRESSFORSD ="/sdcard/welcome.jpg";
5 private ImageView ll;
6 private Bitmap bitmap;
7 private Handler handler = new Handler() {
8 @SuppressLint("NewApi")
9 public void handleMessage(android.os.Message msg) {
10 if (msg.what == ERROR) {
11 Toast.makeText(WelcomeActivity.this, "显示图片错误", 0).show();
12 }
13 };
14 };
15 private File file;
16 @SuppressLint({ "NewApi" })
17 @Override
18 protected void onCreate(Bundle savedInstanceState) {
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.welcome);
21 ll = (ImageView) findViewById(R.id.iv_welcome);
22 file = new File(BITMAPADDRESSFORSD);
23 if (file.exists()) {
24 Bitmap bm = BitmapFactory.decodeFile(BITMAPADDRESSFORSD);
25 ll.setBackground(new BitmapDrawable(bm));
26 }
27 getServiceImage();
28 handler.postDelayed(new Runnable() {
29 @Override
30 public void run() {
31 Intent intent = new Intent(WelcomeActivity.this,
32 MainActivity.class);
33 startActivity(intent);
34 finish();
35 }
36 }, 2000);
37 }
38 // 获取服务器图片
39 private void getServiceImage() {
40 new Thread() {
41 private HttpURLConnection conn;
42 public void run() {
43 // 连接服务器 get 请求 获取图片.
44 try {
45 URL url = newURL("http://172.16.25.39:8080/welcome.jpg");
46 conn = (HttpURLConnection) url.openConnection();
47 // 设置请求的方式
48 conn.setRequestMethod("GET");
49 // 设置超时时间
50 conn.setConnectTimeout(5000);
51 // 设置请求头 User-Agent浏览器的版本
52 conn.setRequestProperty(
53 "User-Agent",
54 "Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1; "
55 + "SV1; .NET4.0C; .NET4.0E; .NETCLR 2.0.50727; "
56 +".NET CLR 3.0.4506.2152; .NET CLR 3.5.30729;Shuame)");
57 // 得到服务器返回的响应码
58 int code = conn.getResponseCode();
59 conn.getResponseMessage();
60 // 请求网络成功后返回码是200
61 if (code == 200) {
62 InputStream is = conn.getInputStream();
63 bitmap = BitmapFactory.decodeStream(is);
64 saveBitmapToSD();
65 } else {
66 // 返回码不是200 请求服务器失败
67 Message msg = new Message();
68 msg.what= ERROR;
69 handler.sendMessage(msg);
70 }
71 } catch (Exception e) {
72 e.printStackTrace();
73 Message msg = new Message();
74 msg.what = ERROR;
75 handler.sendMessage(msg);
76 }
77 };
78 }.start();
79 }
80 public void saveBitmapToSD() throws IOException {
81 File f = new File(BITMAPADDRESSFORSD);
82 f.createNewFile();
83 FileOutputStream fOut = null;
84 try {
85 fOut = new FileOutputStream(f);
86 } catch (FileNotFoundException e) {
87 e.printStackTrace();
88 }
89 bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
90 try {
91 fOut.flush();
92 } catch (IOException e) {
93 e.printStackTrace();
94 }
95 try {
96 fOut.close();
97 } catch (IOException e) {
98 e.printStackTrace();
99 }
100 }
101 }
注意,第48行所用到的服务器地址需要改成自己的地址。
(3)添加权限
需要使用到访问网络与SD卡读写的功能,因此添加相关权限:
<uses-permissionandroid:name="android.permission.INTERNET" />
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
(4)运行程序
运行步骤如下:
1) 当第一次运行项目时会看到默认图片
2) 当第二次打开时会看到从服务器中获取到的图片
3) 如果这时候改变服务器中的图片,再次打开关闭、打开应用程序就会看到最新的图片
三、案例总结
1、与服务器进行交互可以使用HttpURLConnection对象。
2、要在子线程中更新UI要使用Handler对象

