首页 文章 精选 留言 我的

精选列表

搜索[异步扫描],共10000篇文章
优秀的个人博客,低调大师

Android中的异步处理技术之HandlerThread

目录 前言 众所周知如果想要在Android中执行耗时操作需要新建一个线程然后在该线程中实现,但是如果出现一种需要我们频繁进行耗时操作的业务,那我们再频繁的创建线程无疑会使性能降低,而Android SDK为我们提供了一个循环线程的框架刚好可以帮助我们解决这个问题,它就是HandlerThread。 原理 HandlerThread继承了Thread,集成了Looper和MessageQueue,在内部实现了一个消息队列,队列中的消息是顺序执行的因此线程是安全的,HandlerThread内部机制确保了在创建Looper和发送消息之间不存在竞态条件,这个是通过HandlerThread.getLooper()实现为一个阻塞操作实现的,只有当HandlerThread准备好接收消息消息之后才会返回。 public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } /** * Constructs a HandlerThread. * @param name * @param priority The priority to run the thread at. The value supplied must be from * {@link android.os.Process} and not from java.lang.Thread. */ public HandlerThread(String name, int priority) { super(name); mPriority = priority; } /** * Call back method that can be explicitly overridden if needed to execute some * setup before Looper loops. */ protected void onLooperPrepared() { } @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; } public Looper getLooper() { if (!isAlive()) { return null; } // 如果线程已经启动那么在Looper准备好之前应该等待 synchronized (this) { while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; } 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; } /** * Returns the identifier of this thread. See Process.myTid(). */ public int getThreadId() { return mTid; } } 实现 对外开放Handler实例 public class MainActivity extends AppCompatActivity { private HandlerThread mHandlerThread; private Handler mBgHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initHandler(); } private void initHandler() { mHandlerThread=new HandlerThread("myHandlerThread"); mHandlerThread.start(); mBgHandler=new Handler(mHandlerThread.getLooper(), new Handler.Callback() { @Override public boolean handleMessage(Message message) { switch (message.what){ case 0: // 执行操作 break; } return false; } }); } @Override protected void onDestroy() { super.onDestroy(); mHandlerThread.quit(); } } 对外隐藏Handler(需要继承HandlerThread并在onLooperPrepared方法中对Handler进行实例化) public class MyHandlerThread extends HandlerThread { private Handler mHandler; public MyHandlerThread(String name) { super(name); } @Override protected void onLooperPrepared() { super.onLooperPrepared(); mHandler=new Handler(getLooper(), new Handler.Callback() { @Override public boolean handleMessage(Message message) { switch (message.what){ case 1: Log.e("测试","executeOne"+currentThread().getName()); break; case 2: Log.e("测试","executeTwo"+currentThread().getName()); break; } return false; } }); } public void executeOne(){ mHandler.sendEmptyMessage(1); } public void executeTwo(){ mHandler.sendEmptyMessage(2); } } Activity中调用 public class MainActivity extends AppCompatActivity { private TextView tvMainactivityTest; private MyHandlerThread myHandlerThread; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvMainactivityTest = (TextView) findViewById(R.id.tv_mainactivity_test); initHandler(); } private void initListener() { tvMainactivityTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { myHandlerThread.executeOne(); } }); } private void initHandler() { myHandlerThread=new MyHandlerThread("workThread"); myHandlerThread.start(); } } 个人技术博客https://myml666.github.io/

优秀的个人博客,低调大师

scrapy-splash 爬虫渲染异步加载,ajax

首先给出splash官网地址:http://splash.readthedocs.io/en/stable/api.html#render-html 1.安装和准备 (1)先安装scrapy-splash库: pip install scrapy-splash (2)然后将我们的docker起起来 docker run -p 8050:8050 scrapinghub/splash 如果关于docker安装还有更多的问题,请查考: splash安装文档 2.配置 (1)将splash server的地址放在你的settings.py文件里面,如果是你在本地起的,那地址应该是http://127.0.0.1:8050,我的地址如下 SPLASH_URL = 'http://192.168.99.100:8050' (2)在你的下载器中间件:download_middleware 里面启用如下的中间文件,注意启用的顺序 DOWNLOADER_MIDDLEWARES = { 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, } 另外注意: scrapy_splash.SplashMiddleware(725)的顺序是在默认的HttpProxyMiddleware(750)之前,要不然顺序的紊乱会造成功能的紊乱的 HttpCompressionMiddleware的优先级和顺序也应该适当的更改一下,这样才能更能处理请求 查看:https://github.com/scrapy/scrapy/issues/1895.里面提到的一些问题 (3)在settings.py启用SplashDeduplicateArgsMiddleware中间件 SPIDER_MIDDLEWARES = { 'scrapy_splash.SplashDeduplicateArgsMiddleware': 100, } (4)我们来设置一个去重的类 DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter' (5)如果你使用scrapy http 缓存系统,那你就有必要启用这个scrapy-splash的缓存系统 HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage' 如果你有在你自己的settings.py里面启用DEFAULT_REQUEST_HEADERS ,请务必注释掉,目前看来是一个bug ,我已经给scrapy splash 官方提了这个bug https://github.com/scrapy-plugins/scrapy-splash/issues/67 该bug 是由于default_request_headers 里面的host 与我要爬的sougou不匹配,这当然会出错,不得不说scrapy的官方维护人反应真的很迅速。大家添加的headers的时候注意这些细节内容。 代码 # -*- coding: utf-8 -*- from scrapy import Request from scrapy.spiders import Spider from scrapy_splash import SplashRequest from scrapy_splash import SplashMiddleware from scrapy.http import Request, HtmlResponse from scrapy.selector import Selector class SplashSpider(Spider): name = 'scrapy_splash' # main address since it has the fun list of the products start_urls = [ 'https://item.jd.com/2600240.html' ] # allowed_domains = [ # 'sogou.com' # ] # def __init__(self, *args, **kwargs): # super(WeiXinSpider, self).__init__(*args, **kwargs) # request需要封装成SplashRequest def start_requests(self): # text/html; charset=utf-8 for url in self.start_urls: yield SplashRequest(url , self.parse , args={'wait': '0.5'} # ,endpoint='render.json' ) pass def parse(self, response): print "############"+response._url fo = open("html.txt", "wb") fo.write(response.body); # 写入文件 fo.close(); #本文只抓取一个京东链接,此链接为京东商品页面,价格参数是ajax生成的。会把页面渲染后的html存在html.txt #如果想一直抓取可以使用CrawlSpider,或者把下面的注释去掉 '''site = Selector(response) links = site.xpath('//a/@href') for link in links: linkstr=link.extract() print "*****"+linkstr yield SplashRequest(linkstr, callback=self.parse)'''

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册