Android多线程编程————微信页面加载示例

为什么使用多线程?

       因为所有代码都默认运行在主线程当中,所以当程序运行需要执行一些耗时操作,如发起一条网络请求时,由于网速等原因,服务器未必立刻响应请求,如果不将这类操作放在子线程里去运行,就会导致主线程被阻塞住。

 

现在我们实现一个简单的微信初始化加载页面的过程

      首先,微信初始化加载页面,并不需要进行任何控件的点击监听,所以,在这里新建一个活动并且在设置为程序入口,命名为LoadingActivity.java和自定义布局。在布局中,使用android:background = “@绘制/加载”的方式加载图片。

 

1.线程的基本用法

使用匿名类的方式实现可运行接口(更常见),如下:

new Thread(new Runnable() {
	@Override
	public void run() {
	// 处理具体的逻辑
	}}).start();

2.在子线程中不能直接更新UI

Android的UI是线程不安全的,想更新应用程序里的UI元素,则必须在主线程中进行,否则会出现异常。

若必须在子线程中执行耗时任务,根据任务执行结果更新相应UI控件?

Android提供了一套异步消息处理机制

 

解析异步消息处理机制

        Android中的异步消息处理主要由四个部分组成,Message,Handler,MessageQueue和Looper。这里只需使用消息,Handler这两部分。

1.消息

在线程之间传递的消息,可在内部携带少量信息,用于在不同线程间交换数据。什么字段是消息的标记,obj字段携带对象对象,arg1和arg2字段携带整型数据。

2.处理程序

处理者,主要用于发送和处理消息。发送消息sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到Handler的handleMessage()方法中。

3. MessageQueue

消息队列,主要存放所有通过处理程序发送的消息(一直存在于消息队列中等待被处理)。每个线程中只会有一个的MessageQueue对象。

4. Looper

是每个线程中MessageQueue的管家,调用Looper的loop()方法会进入到一个无限循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中。每个线程中也只会有一个Looper对象。

 

 

 

以下是示例代码段

public class LoadingActivity extends AppCompatActivity {
    ImageView starApp;//进行登录图像加载

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_loading);
        starApp =findViewById(R.id.starApp);//控件绑定
        loadingPicture();
    }

    boolean values = false;//标志位
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what ==1){
                starApp.setImageResource((Integer) msg.obj);//图片属性需要强转
                values =true;
            }
        }


    };

    private void loadingPicture() {
        new Thread(new Runnable() {//常见的使用匿名类的方式实现Runnable接口
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);//设置延迟2s
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Message message = new Message();
                message.what = 1;//what 字段是消息的标记
                message.obj = R.drawable.loading; //obj 字段携带Object对象,

                handler.sendMessage(message);
                /*发送消息sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到Handler 的handleMessage()方法中。
                 */
                if (values =true){//如果是turn,则开始加载
                    Intent intent = new Intent(LoadingActivity.this,LoginActivity.class);
                    startActivity(intent);
                    finish();//点击取消就可以返回退出程序(模拟器桌面)
                }
            }
        }).start();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40030258/article/details/85049772