当前位置: 首页 > news >正文

竞价网站与竞价网站之间做友情链接网站备案通过后怎么办

竞价网站与竞价网站之间做友情链接,网站备案通过后怎么办,广州做网站建设哪家专业,seo关键词排名优化怎么样上一篇: IntentService 深度解析 上一篇我们从源码中看到IntentService内部的线程机制,是采用HandlerThread来实现的,这里我们就来深度解析下HandlerThread。推荐先看一下Handler机制详解(实例 源码) 先看个源码吧…

上一篇:

IntentService 深度解析

上一篇我们从源码中看到IntentService内部的线程机制,是采用HandlerThread来实现的,这里我们就来深度解析下HandlerThread。推荐先看一下Handler机制详解(实例 + 源码)

先看个源码吧!毕竟很简单!

Handler是用于线程通讯的。HadndlerThread 是带Handler的子线程。

  • 我们一般是子线程往主线程发消息,例如更新UI进度之类的。可以直接在主线程new Handler()。
  • 一些特殊情况下,主线程需要往子线程发消息,需要在子线程创建Looper、Handler对象,用于接收处理消息

HandlerThread源码

  • name指定线程名字

  • priority代表优先级。优先级范围为-20到19,默认为0,优先级越高,获得的CPU资源更多,反之则越少。-20代表优先级最高,反之19最低。注意使用的是 android.os.Process 而不是 java.lang.Thread 的优先级!

  • onLooperPrepared() 可以做一些初始化工作,在Looper.loop()之前调用

HandlerThread用于和子线程进行通讯:

  • 普通线程,调用start(),虚拟机会切换线程执行run()方法

  • HandlerThread在子线程中创建Looper、MessageQueue、Handler对象,通过这个handler给子线程发送消息,子线程接收到能做出相应处理

    • 在run()方法中,也就是子线程中
      Looper.prepare(),创建一个子线程的looper对象、MessageQueue对象
      Looper.loop(),遍历,取出消息进行执行
    • 提供getLooper()方法,如果线程存活,且mLooper不为空,则返回Looper对象(可能mLooper创建需要一定时间)
    • 提供getThreadHandler()方法,返回一个指定looper对象的handler对象,也就是处于子线程中handler对象
    • 提供quit()、quitSafely()方法,用于退出looper
public class HandlerThread extends Thread {int mPriority;int mTid = -1;Looper mLooper;private @Nullable Handler mHandler;public HandlerThread(String name) {super(name);mPriority = Process.THREAD_PRIORITY_DEFAULT;}//指定线程的优先级,注意使用的是 android.os.Process 而不是 java.lang.Thread 的优先级!public HandlerThread(String name, int priority) {super(name);mPriority = priority;}//子类可以重写,在这里做一些执行前的初始化工作protected void onLooperPrepared() {}@Overridepublic void run() { //当调用thread.start()后,会执行run方法mTid = Process.myTid();Looper.prepare();synchronized (this) {mLooper = Looper.myLooper();notifyAll(); //Looper 已经创建,唤醒等待获取 Looper 的线程}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop();mTid = -1;}//获取当前线程的 Looper,如果线程尚未启动或者已经dead,就返回 null//如果线程已经启动但Looper 还没初始化完成,这个方法会阻塞直到looper已经准备好,并返回Looper对象public Looper getLooper() {if (!isAlive()) {return null;}synchronized (this) {while (isAlive() && mLooper == null) { //循环等待,直到mLooper != nulltry {wait();} catch (InterruptedException e) {}}}return mLooper;}@NonNullpublic Handler getThreadHandler() {if (mHandler == null) {mHandler = new Handler(getLooper());}return mHandler;}public boolean quit() {Looper looper = getLooper();if (looper != null) {looper.quit();return true;}return false;}public boolean quitSafely() {Looper looper = getLooper();if (looper != null) {looper.quitSafely();return true;}return false;}public int getThreadId() {return mTid;}
}

实例讲解

这里只是为了实现方便,可能会存在内存泄露问题。

大致场景是:

1、主线程叫子线程去做事 (定义一个子线程的Handler,就是threadHandler啦,threadHandler.sendMessage)

2、子线程执行完毕,通知主线程 (threadhandler.handleMessage处理耗时任务)

3、主线程收到消息,更新UI或者其它的

public class HandlerThreadActivity extends AppCompatActivity {private Button downloadBtn;private TextView displayTv;private int count = 1;//UI线程的Handler,可以更新UIprivate Handler mUIHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {Log.e("zhen", "主线程Handle收到任务 " + msg.what +"的反馈,很满意! thread: " + Thread.currentThread().getId());displayTv.setText("主线程Handle收到消息 "+ msg.what);return true;}}) ;private HandlerThread mHandlerThread; //创建一个带Looper的线程private Handler mHandler; //以子线程的Looper为入参创建一个子线程的Handler@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler_thread);initView();intHandler();}private void intHandler() {mHandlerThread = new HandlerThread("zhen");mHandlerThread.start(); //必须要HandlerThread.start之后才能创建Handler,不然Looper.mQueue为空mHandler = new Handler(mHandlerThread.getLooper()){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);Log.e("zhen","子线程里handle收到任务" + msg.what +",并开始处理 threadId: " + Thread.currentThread().getId());try {int progress = 0;do{Thread.sleep(2000); //mHandler的handleMessage是在子线程中执行的progress += 20;Log.d("zhen","子线程工作进度" + progress + "% ....");} while (progress < 100);Log.e("zhen","子线程任务" + msg.what +"执行完,通知UI线程 threadId: " + Thread.currentThread().getId());mUIHandler.sendEmptyMessage(msg.what);} catch (InterruptedException e) {e.printStackTrace();}}};}private void initView() {downloadBtn = findViewById(R.id.downloadBtn);displayTv = findViewById(R.id.displayTv);downloadBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mHandler.sendEmptyMessage(count);Log.e("zhen","主线程给子线程handle发出任务" + count +",开始工作啦! threadId: " + Thread.currentThread().getId());count++;}});}@Overrideprotected void onDestroy() {super.onDestroy();mHandlerThread.quit();}
}

1、点击downloadBtn一次:

2、点击downloadBtn两次:

是不是很类似IntentService的效果,在子线程中顺序执行(因为是一次执行完一个msg,再去执行下一个msg啦)

另外是不是感觉这日志有3D效果,看的眼睛疼。

http://www.yayakq.cn/news/330567/

相关文章:

  • 长沙大的建网站公司新余专业的企业网站建设公司
  • 网站建设需求流程图ui设计界面效果图
  • 义乌外贸建站西安seo关键词查询
  • 免费安全正能量网站大全互联网内容服务商有哪些
  • 全省建设信息网站加强网站的建设工作的通知
  • 佛山新网站建设效果页面
  • 网站app建站多少钱wordpress媒体库图片不加载
  • 广东网站设计专业团队a设计网站有哪些
  • 网站建设需求调研表模板机械加工厂家
  • 企业网站建设费用需要多少钱做网站怎么加水平线
  • 简洁中文网站模板动态Js文件 做网站标题
  • 培训网站导航河南省住房和城乡建设厅官网查询
  • 网站做seo外链广州pc网站建设
  • 淘宝活动策划网站结婚证app制作软件
  • 做冷冻食品的网站将公司网站建设成
  • 表白网站制作系统源码企帮手logo设计官网
  • 做网站托管网站自然排名往后掉
  • 河南省建设厅网站建设领域涉黑旅游网站后台管理系统
  • 泰州网页网站制作天津做网站优化的公司
  • 建筑品牌网站做外贸的网站怎么建立
  • 网站建设达到什么水平建设银行网站开通查询密码
  • CMS源码就可以做网站吗深圳出国劳务公司官网
  • 网站开发的名称叫什么wordpress防止爆破
  • 简答网站内容建设的时候内链重要性wordpress 禁止更新提示
  • 在哪个网站可以做酒店预定单163网站视频动做
  • 各大网站收录提交入口网站建设基础与网页设计
  • 合肥大型网站设计公网站城市切换如何做
  • 订餐网站模板下载线框图网站
  • 布局网站开发网站怎么投放广告
  • 建设银行 网站用户广告软文营销平台