消息机制 →网络图片查看器

来源:互联网 发布:网络中两台计算机重名 编辑:程序博客网 时间:2024/05/17 01:44

1. 子线程利用handler发送一条消息,消息被放在主线程的消息队列里面

2. 主线程里面有一个looper消息的轮询器

3. 如果轮询器发现了新的消息,调用handlemessage的方法处理消息


MainActivity

package org.gentry.readpicture;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;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.View;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends Activity {protected static final int CHANGE_UI = 1;protected static final int ERROR = 2;private EditText et_path;private ImageView iv;// 1. 主线程创建消息处理器(handler)private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {if (msg.what == CHANGE_UI) {Bitmap bitmap = (Bitmap) msg.obj;iv.setImageBitmap(bitmap);} else if (msg.what == ERROR) {Toast.makeText(MainActivity.this, "显示图片失败", Toast.LENGTH_LONG).show();}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_path = (EditText) findViewById(R.id.et_path);iv = (ImageView) findViewById(R.id.iv);}public void click(View view) {final String path = et_path.getText().toString().trim();if (TextUtils.isEmpty(path)) {Toast.makeText(this, "图片路径不能为空", Toast.LENGTH_SHORT).show();} else {// 放在子线程里面执行(子线程不能更改主线程的UI)new Thread() {public void run() {// 连接服务器get请求获取图片try {URL url = new URL(path);// 根据url发送http请求HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 设置请求的方式conn.setRequestMethod("GET");conn.setConnectTimeout(5000);// conn.setReadTimeout(5000);conn.setRequestProperty("User-Agent","Mozilla/4.0(compatible;MAIE 6.0; Windows NT 5.1; SV1; .NET4.OC; .NET4.OE; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; Shuame)");// 得到服务器返回的响应码int code = conn.getResponseCode();if (code == 200) {InputStream is = conn.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(is);// iv.setImageBitmap(bitmap);// TODO 告诉主线程一个消息,帮我更改界面。内容:bitmapMessage msg = new Message();msg.what = CHANGE_UI;msg.obj = bitmap;handler.sendMessage(msg);} else {Message msg = new Message();msg.what = ERROR;handler.sendMessage(msg);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();Message msg = new Message();msg.what = ERROR;handler.sendMessage(msg);}};}.start();}}}



0 0
原创粉丝点击