7/28

Android Service基础强化与刨析

text:
Android Service
android郭霖
{
Toast->long
page : 339-378
step:
o:read
t:code
3:00 -> 8:00
}

content:
概念:在很久之前,有一个诺基亚的Symbian手机可以支持后台之后出现了android 和ios那么什么是后台
后台就是你可以挂qq又可以聊WeiChat
服务存在与 -> 创建服务程序的应用进程之中->一旦服务被销毁与之关联的进程也被destroy
不会自动开启线程,所有服务默认在主线程中 需要在服务的内部开启线程 并且执行具体的任务,不然会导致线程被阻塞的情况 ->需要了解多线程的概念
Android多线程的基本概念:
一个荔子: 当我么想要在执行一些耗时操作,比如发送一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如果不将这类操作放到子线程中去运行,就会导致主线程被阻塞住,从而影响用户对软件的正常使用。
example-> 线程的基本用法以及在在子线程中更新ui
一中是直接新建一个类,写好布局文件,加一个点击事件,点击之后 setOnclickListener 里面
new Thread(new Runnable){
public void run(){
//逻辑

}

}.start();

这就是创建线程了
不陌生继续看
子线程更新UI
但是当我们一般这样点击之后 就会发现程序崩溃了
它的意思就是说不能更新UI界面了!崩给你看
接着 解决办法-> Android默认提供了一款异步消息机制来处理
代码如下
package com.example.myapplication2;

        import androidx.appcompat.app.AppCompatActivity;
        
        import android.os.Bundle;
        
        public class MainActivity extends AppCompatActivity {
        	
        	private static final int UPDE_TEXT = 1;
        	
        	private Handler handler = new Handler(){
    		private void handlerMessage(){	
    		switch(msg.what){
    		case UPDE_TEXT:
    		 break;
    		 default:break;
		 }
    	}
    
    }
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                findViewById(R.id.##).setOnClickListenter(new View.onClickListener(){
                new Thread(new Runnable(){
    			Message age = new Message();
    			message.what = UPDATE_TEXT;
    			handler.sendMessage(message);
				
    	      )}
    	).start();
         });
            }
        }

以上就是handler的异步消息处理机制了
原理刨析->

messge 和 handle 一个是携带消息,一个是发送和处理消息的 messageQueue 是消息队列的意思
->它主要用于存放所有通过handler发送的消息。这部分消息会一直存在与消息队列中,等待被处理一个线程之中只能有一个MessageQueue
对象
Looper用来查看messageQueue 中有没有message,每个线程也只会有一个looper对象

梳理异步消息的处理流程
  ->  首先在主线程中重写handlerMesage方法,接着在子线程中(子线程就是new Thread)创建message对象,并通过handler 将这条消息发送出去,之后这条消息会被添加到MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分发回Handler的handlerMessage()方法中。

不过为了方便我们在子线程中更新UI android 提供了AsyncTask来更新UI
通过源码可以看出 Asynk<params,progress,Result>
params -> 在执行任务时需要传入的参数,可用于在后台任务中使用
progress 后台执行任务时,如果需要在界面上显示当前的进度,则使用这里指定的泛型为进度单位
Result-> 当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型
一般extends 之后重新4个方法
-> 1 onPreExcute
处理一些简单的初始化,比如,显示一个进度条->所以我猜测优先级最高
2 doinBackground
好比handler 子线程不可以更新ui ,如果第三个参数是void 则无返回值->如果非要更新UI 使用publishProgress方法
3 onProgressUpdate(Progress…)
当在后台调用了publishProgress方法之后,会调用此方法。 参数就是publishProgress(Integer value) 的values值,这个值取决于第二个参数,接着可以使用返回的数据来进行一些ui操作
4.onPostExecute(result)
当后台任务执行完毕之后并通过return语句进行返回时,这个方法就很快被调用,返回的数据传递过来。可以用来update ui

example->

private class MyAsyncTask extends AsyncTask<Void, Integer, Boolean> {


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog.show();
        }

        @Override
        protected Boolean doInBackground(Void... voids) {
            //all in the run thread
            //handle time consuming task pass return back result
            //if update asyncTask use publishProgress finish task
//            publishProgress(10);
            while (true) {
                int doDoWnload = doDoWnload();

                publishProgress(doDoWnload);//update ui
                if (doDoWnload >= 100) {
                    break;
                }
                return false;
            }
            return true;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            //publishProgress(10) ->10 values 就是10
            // update ui 界面
            dialog.setMessage("Downloader " + values[0] + "%");
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);
            //when doinBackground execution finish return arrivals there
            dialog.dismiss();
            if (aBoolean) {
                Toast.makeText(MainActivity.this, "Download successed", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "DownLoad faild", Toast.LENGTH_SHORT).show();
            }
        }
    }

我们只需要使用publishProgress就可以实先UI 界面的更新了

开始学习service 吧->
首先可以新建一个类继承service 并且重新四个方法
onCreate 新建

	 onStartCommand(Intent intent,int flags,int startid)
	 使用startService会调用可以看26号的日记

接着学会使用之后的的操作就很简单了

接着小伙伴帮我看了一下我项目的一些逻辑bug问题明天试一下,主要是我太渺小了->
今晚啥都不想干了,想早点睡觉了  
  唉,自己太渺小了,学习东西真心难懂

th:summary

adroid任玉刚
{
Toast->short
Page: 336-344
step:
o:read
t:code
th:8:00- 10:00
}
android李刚
{
Toast->short
Page:459-467
o:read
t:code
th:10:00 -10:30

}
end-> summary:

发布了81 篇原创文章 · 获赞 34 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41914317/article/details/97614422