Android 进程&多线程

本文详细介绍了Android中进程与线程的概念,包括不同类型的进程及其优先级,并深入探讨了如何在Android应用中管理和更新UI,同时覆盖了线程创建方式、异步任务处理及定时器实现方法。

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

进程&多线程

Android的四大组件都是运行在主线程当中的

进程的优先级叙述
前台进程(Foreground process)优先级最高, 得到焦点onResume(), 正在和用户交互
可视进程(Visible process)一直影响用户看得见 相当于onPause()
服务进程(Service process)就是开启的服务
后台进程(Backfround process)界面不可见, 但还没销毁, 相当于onStop()
空进程(Empty process)就是空闲的内存空间







只有主线程才能更新UI

在其它线程更新UI方法:


  1. Handler发消息和处理消息: (Handler发消息到MessageQueue(消息队列),Looper(消息循环监视器)监视MessageQueue,循环取出消息到Handler处理消息)
//发消息
handler.sendEmptyMessage(100);  //简单的消息(编号100,只有编号)

Message msg = Message.obtain(); //创建消息
msg.what = 747;                 //消息编号
msg.obj = value;                //携带数据value
handler.sendMessage(msg);       //发送消息

//接收处理消息
private Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) { //接收消息
        switch (msg.what) {
        case 100:
            break;
        case 747:
            String value = (String) msg.obj;
            System.out.println("执行更新UI操作:"+value);
            break;
        default:
            break;
        }
}};

class MyThread extends Thread {    @Override    public void run() {        lw(); //联网    }}

  1. 使用 runOnUiThread 直接在UI线程执行:
runOnUiThread(new Runnable() { //在UI线程里执行action (不管在哪里都可以调用)
    @Override    public void run() {
        Toast.makeText(getApplicationContext(), "执行更新UI操作:"+value, 0);
}});

  1. View.post(Runnable)







多线程

java中创建线程有两种方法:


  1. 直接继承Thread类,重载它的run()方法;(编写简单,可以直接操作线程,一般适用于单重继承的情况)
class MyThread extends Thread{
    @Override
    public void run(){
        /*新开线程要做的事~~*/
    }
} 
new MyThread().start(); //启动 

/* 简单写法 new Thread(){ public void run(){System.out.println("新开线程..");};}.start();*/

  1. 实现Runnalbe接口,重载Runnalbe接口中的run()方法。(可以使多个子线程之间使用同一个Runnable对象,共享同一些资源,比如在类里定义一个int…)
public class MyRunnable implements Runnable{
    public void run(){
        System.out.println("新开线程..");
    }
}







异步处理 AsyncTask

学习自:http://blog.youkuaiyun.com/wxg630815/article/details/7003812
AsyncTask(AAA, BBB, CCC)

参数属性
AAAexecute()方法时传入的参数类型和doInBackgound()的参数类型
BBBpublishProgress()和onProgressUpdate()的参数类型
CCCdoInBackground()的返回值类型
方法解析:
doInBackgound()这个方法是继承AsyncTask必须要实现的,运行于后台,耗时的操作可以在这里做 == Run()
publishProgress()更新进度,用于给onProgressUpdate()传递进度参数
onProgressUpdate()在publishProgress()调用完被调用,更新进度

例子:

public class MyActivity extends Activity  
{  
    private Button btn;  
    private TextView tv;  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        btn = (Button) findViewById(R.id.start_btn);  
        tv = (TextView) findViewById(R.id.content);  
        btn.setOnClickListener(new Button.OnClickListener(){  
            public void onClick(View v) {  
                update();  
            }  
        });  
    }  
    private void update(){  
        UpdateTextTask updateTextTask = new UpdateTextTask(this);  
        updateTextTask.execute();  
    }  

    class UpdateTextTask extends AsyncTask<Void,Integer,Integer>{  
        private Context context;  
        UpdateTextTask(Context context) {  
            this.context = context;  
        }  

        /** 
         * 运行在UI线程中,在调用doInBackground()之前执行 
         */  
        @Override  
        protected void onPreExecute() {  
            Toast.makeText(context,"开始执行",Toast.LENGTH_SHORT).show();  
        }  
        /** 
         * 后台运行的方法,可以运行非UI线程,可以执行耗时的方法 
         */  
        @Override  
        protected Integer doInBackground(Void... params) {  
            int i=0;  
            while(i<10){  
                i++;  
                publishProgress(i);  
                try {  
                    Thread.sleep(1000);  
                } catch (InterruptedException e) {  
                }  
            }  
            return null;  
        }  

        /** 
         * 运行在ui线程中,在doInBackground()执行完毕后执行 
         */  
        @Override  
        protected void onPostExecute(Integer integer) {  
            Toast.makeText(context,"执行完毕",Toast.LENGTH_SHORT).show();  
        }  

        /** 
         * 在publishProgress()被调用以后执行,publishProgress()用于更新进度等
         */  
        @Override  
        protected void onProgressUpdate(Integer... values) {  
            tv.setText(""+values[0]);  
        }  
    }  
} 







定时器 实现 的 三种方法


1. Handler类自带的postDelyed

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        handler.postDelayed(runnable, 1000); //初次执行 每隔1s执行
    }

    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            // handler自带方法实现定时器
            try {
                handler.postDelayed(this, 1000);    //1000毫秒后再次启动
                /*
                 * view 刷新方法
                 * 主线程可以直接调用Invalidate()方法刷新
                 * 子线程可以直接调用postInvalidate()方法刷新。
                 */
                Toast.makeText(MainActivity.this, "又一秒过去了", 1).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
}

2. Handler+Thread

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(new ThreadShow()).start();
    }
 // handler类接收数据  
    Handler handler = new Handler() {  
        public void handleMessage(Message msg) {  
            if (msg.what == 1) {  
                System.out.println("receive....");  
            }  
        };  
    };  

    // 线程类  
    class ThreadShow implements Runnable {  

        @Override  
        public void run() {   
            while (true) {                  //通过使用无限循环
                try {   
                    Thread.sleep(1000);   //使线程挂起一段时间  一秒
                    Message msg = new Message();  
                    msg.what = 1;  
                    handler.sendMessage(msg);  
                    System.out.println("send...");  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}

THREE

Handler+Timer+TimerTask

public class MainActivity extends Activity {

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

        timer.schedule(task, 5000, 1000); // 5s后执行task ,之后每隔1s后都执行  
        //timer.cancel(); //终止计时器
        }  

        Handler handler = new Handler() {  
            public void handleMessage(Message msg) {  
                if (msg.what == 1) {  
                    System.out.println("omggggggggg");
                }  
                super.handleMessage(msg);  
            };  
        };  
        Timer timer = new Timer();      //定时器
        TimerTask task = new TimerTask() {   //定时器事件
            @Override  
            public void run() {   
                Message message = new Message();  
                message.what = 1;  
                handler.sendMessage(message);  
            }  
        };    
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值