通过HTTP访问网络资源

添加访问网络的权限:<uses-permission android:name="android.permission.INTERNET"/>

package com.shz.imageviewer;

import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import android.os.Build;

public class MainActivity extends Activity {

    private ImageView iv;
    private EditText txtPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.iv = (ImageView) this.findViewById(R.id.iv);
        this.txtPath = (EditText) this.findViewById(R.id.txtPath);
    }
    
    // Android新版系统中不允许UI处理比较耗时的操作(ANR),如果有耗时操作,可以通过开启一个子线程去处理;
    // 只有UI线程可以更新view对象。
    
    // 如果有多个子线程更新UI,更新UI完毕后,检查这个更新的操作是否在主线程的代码中执行的,
    // 如果是主线程,则不会有问题
    // 如果不是主线程,则会抛出异常:CalledFromWrongThreadException
    
    // 1.定义一个handler消息处理器
    private Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 1:
                Bitmap bitmap = (Bitmap)msg.obj;
                iv.setImageBitmap(bitmap);
                break;
            case 2:
                Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_LONG).show();
                break;
            default:
                break;
            }
        }        
    };
    
    private void sendMessage(int what,Object obj)
    {
        Message msg = new Message();
        msg.what = what;
        msg.obj = obj;
        handler.sendMessage(msg);
    }

    public void click(View view) {
        final String path = this.txtPath.getText().toString().trim();
        if (TextUtils.isEmpty(path)) {
            return;
        }
        
        // 2.开启一个子线程获取网络图片资源数据
        new Thread(){
            public void run() {
                try {
                    URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(10000);
                    conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36");

                    int code = conn.getResponseCode();
                    if ( code == 200) {
                        Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream());
                        
                        // 3.利用handler消息处理器发送一条消息到主线程的MessageQueue消息队列中,主线程中
                        //   有一个消息轮询器Looper,此Looper会去不断的轮询MQ中的消息并
                        //   交给handler的handleMessage()方法去处理
                        sendMessage(1, bitmap);
                    } else {
                        sendMessage(2, "获取图片失败");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    sendMessage(2, "获取图片失败");
                }
            };
        }.start();
    }
}

posted @ 2014-08-12 23:20  萌浩  阅读(260)  评论(0编辑  收藏  举报