Android基础#40:Android 多线程编程

本文详细介绍了Android系统中的多线程机制,包括如何在UI线程和自定义线程间进行通信,以及如何使用Handler类作为Runnable和Activity之间的桥梁。通过实例演示了如何使用线程来计算变量并更新窗口标题,强调了线程安全性和效率提升的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容简介:

相信大家都用过Handler+Thread的方式开发过Android应用程序。
在Android系统中,是支持多线程的。UI线程时主线程,用户也可以定义多个线程,他们之间也可以进行通信,正如java一样。
使用多线程,我们可以最大化的利用系统资源,提高应用程序的相应速度,增强用户体验。与Java中的多线程相比,几乎没有什么变化,
需要注意的是,只要把Java中的线程概念弄明白,Android也不在话下。

常用的方法:

常用的线程方法有:

start();

run();

sleep();

stop();

destroy();

join();

suspend();

resume();

yield();
wait();
notify();

 

其中,start用于启动线程;run用于执行线程中的核心代码;sleep用于线程休眠;stop停止线程;destroy销毁线程;

join用于线程同步;

run结束时线程自动死亡。

举例:

这里我使用一个线程来计算变量并更新窗口标题。

这里没有使用updatetitle直接更新窗口,而是使用handler,这是因为直接使用是不安全的,会造成线程重启等问题。Android 引进了Handler 这个特殊的类,用它作为Runnable和Activity交互的桥梁,所以我们只能在run方法中发送Message,而在Handler里,通过不同的Message执行不同的任务。为程序添加handler;

线程还有另外一种常用的方法是编写Runnable接口,这里对代码做一些修改,使用线程实现对主窗口重绘,全部代码如下:

package com.example.app1;


import android.app.Activity;
import android.content.Context;
import android.os.Bundle;

import java.lang.Thread;

import android.view.View;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;

public class TestThreadActivity extends Activity {
    int c = Color.BLUE;
    MyThread myThread;
    volatile boolean bThreadRun = false;
    MyView mv;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // setContentView(R.layout.main);
        mv = new MyView(this);
        setContentView(mv);
    }

    //MyView的定义
    public class MyView extends View {
        MyView(Context context) {
            super(context);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);

            // 首先定义一个paint
            Paint paint = new Paint();

            // 绘制矩形区域-实心矩形
            // 设置颜色
            paint.setColor(c);
            // 设置样式-填充
            paint.setStyle(Style.FILL);
            // 绘制一个矩形
            canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);
        }

    }

    @Override
    protected void onRestoreInstanceState(android.os.Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onSaveInstanceState(android.os.Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onStart() {
        super.onStart();
        //myThread = new MyThread();
        //myThread.start();
        new Thread(new MyThread()).start();
        bThreadRun = true;
    }

    @Override
    protected void onRestart() {
        super.onRestart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        bThreadRun = false;
        // myThread.stop();
    }

    @Override
    protected void onStop() {
        super.onStop();
        onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // myThread.destroy();
    }

    //线程的定义
    public class MyThread implements Runnable {
        // 线程的主要工作方法
        @Override
        public void run() {
            while (bThreadRun) {
                try {
                    Thread.sleep(500);
                    if (c > ((1 << 31) - 1)) {
                        c = 0;
                    } else {
                        c += 100;
                    }
                    mv.postInvalidate();
                } catch (InterruptedException e) {
                }
            }
        }

    }

}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值