[android] android消息机制入门详解手机开发

上一节,先把访问网络的部分放到一个子线程里面去执行,new Thread(){}.start()new Thread直接使用匿名内部类来实现,重写run()方法,内部类访问外部的变量,这个变量应该定义成final的。

直接运行会报错,Only the original thread that created can touch xxxxx,只有主线程才可以访问View对象,是因为线程的同步与互斥

内部实现更新界面的时候做了一个检查,检查这个更新的操作是否是在Ui线程里面执行的,如果是没有任何问题,如果不是抛出一个运行时异常,CalledFromWrongThreadException

 

在上一节,我们在子线程里面访问网络之后,直接调用ImageView对象的setImageBitmap()修改Ui界面了,所以会报错

 

我们需要,在子线程里面告诉主线程一个消息,我们要修改界面,把内容Bitmap传递给主线程,让他帮我们修改。

 

子线程通过Handle发送一条消息,消息被放到消息队列里面,

主线程里有一个Looper消息的轮询器

如果轮询器发现了新的消息,调用Handle对象的handleMessage()来处理消息

 

Handler是一个消息处理器必须在主线程里面new出来

 [android] android消息机制入门详解手机开发

在主线程的成员属性里面定义Handler,直接new Handler匿名内部重写他的handleMessage()方法

子线程里面,调用Handler对象的sendMessage(msg)方法,把消息放入消息队列,参数:msgMessage对象,new出来Message对象,设置Message对象的what属性=一个自定义的int常量,设置Message对象的obj属性=要传递的内容。

 

在主线程handlerMessage的重写方法内部,会得到这个Message对象,对what属性进行判断,调用ImageView对象的setImageBitmap()方法,把Message对象的obj属性放进去。

 

package com.tsh.internetpic; 
 
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 = 0; 
    protected static final int ERROR = 1; 
    private EditText et_path; 
    private ImageView iv_pic; 
    // 主线程里面定义消息处理器 
    public Handler handler = new Handler() { 
        @Override 
        public void handleMessage(Message msg) { 
            if(msg.what==CHANGE_UI){ 
                //更改ui 
                Bitmap bm=(Bitmap) msg.obj; 
                iv_pic.setImageBitmap(bm); 
            }else if(msg.what==ERROR){ 
                String showMsg=(String) msg.obj; 
                Toast.makeText(MainActivity.this, showMsg, 0).show(); 
            } 
        } 
    }; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        et_path = (EditText) findViewById(R.id.et_path); 
        iv_pic = (ImageView) findViewById(R.id.iv_pic); 
    } 
    //点击 
    public void getInternetImg(View v) { 
        final String path = et_path.getText().toString().trim(); 
        if (TextUtils.isEmpty(path)) { 
            Toast.makeText(this, "图片路径不能为空", 0).show(); 
        } else { 
 
            // 开一个子线程 
            new Thread() { 
                @Override 
                public void run() { 
                    try { 
                        URL url = new URL(path); 
                        HttpURLConnection conn = (HttpURLConnection) url 
                                .openConnection(); 
                        conn.setRequestMethod("GET"); 
                        conn.setConnectTimeout(5000); 
                        conn.setRequestProperty("User-Agent", ""); 
                        int code = conn.getResponseCode(); 
                        if (code == 200) { 
                            InputStream is = conn.getInputStream(); 
                            Bitmap bp = BitmapFactory.decodeStream(is); 
                            //发送消息 
                            Message msg = new Message(); 
                            msg.what = CHANGE_UI; 
                            msg.obj = bp; 
                            handler.sendMessage(msg); 
                             
                        } else { 
                            Message msg = new Message(); 
                            msg.what = ERROR; 
                            msg.obj = "网络连接错误"; 
                            handler.sendMessage(msg); 
                            // Toast.makeText(this, "网络连接超时", 0).show(); 
                        } 
                    } catch (Exception e) { 
                        e.printStackTrace(); 
                    } 
                } 
 
            }.start(); 
 
        } 
    } 
}

 

[android] android消息机制入门详解手机开发

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/5482.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论