CD创意公寓(天河公寓店)怎么样,好不好的默认点评

美食, 餐厅餐饮, 团购,生活,优惠券-大众点评网
抱歉!页面无法访问......
错误信息:
currentDate: 02:27:03
userIp:121.235.202.191, 10.72.40.6
userAgent:Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
(C) dianping.com, All Rights Reserved. 本站发布的所有内容,未经许可,不得转载,详见 。&figure&&img src=&https://pic3.zhimg.com/v2-cee01f2d76ab44af21ee6_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic3.zhimg.com/v2-cee01f2d76ab44af21ee6_r.jpg&&&/figure&&p&欢迎大家前往&a href=&https://link.zhihu.com/?target=https%3A//cloud.tencent.com/developer& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&云+社区&/a&,获取更多腾讯海量技术实践干货哦~&/p&&blockquote&由 &a href=&https://link.zhihu.com/?target=https%3A//cloud.tencent.com/developer/user/1309561& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&天天P图攻城狮&/a& 发布在云+社区&br&作者简介&b&:&/b&damonxia(夏正冬),天天P图Android工程师&/blockquote&&p&下文中Demo的源代码地址:&a href=&https://link.zhihu.com/?target=https%3A//github.com/xiazdong/FragmentDemo& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&github.com/xiazdong/Fra&/span&&span class=&invisible&&gmentDemo&/span&&span class=&ellipsis&&&/span&&/a&。&/p&&h2&基本概念&/h2&&p&Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。&/p&&p&过去support-v4库是一个jar包,24.2.0版本开始,将support-v4库模块化为多个jar包,包含:support-fragment, support-ui, support-media-compat等,这么做是为了减少APK包大小,你需要用哪个模块就引入哪个模块。&/p&&p&如果想引入整个support-v4库,则&code&compile 'com.android.support:support-v4:24.2.1'&/code&,如果只想引入support-fragment库,则&code&com.android.support:support-fragment:24.2.1&/code&。&/p&&blockquote&因为support库是不断更新的,因此建议使用support库中的android.support.v4.app.Fragment,而不要用系统自带的android.app.Fragment。而如果要使用support库的Fragment,Activity必须要继承FragmentActivity(AppCompatActivity是FragmentActivity的子类)。&/blockquote&&p&Fragment官方的定义是:&/p&&blockquote&A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running.&/blockquote&&p&根据上面的定义可知:&/p&&ul&&li&Fragment是依赖于Activity的,不能独立存在的。&/li&&li&一个Activity里可以有多个Fragment。&/li&&li&一个Fragment可以被多个Activity重用。&/li&&li&Fragment有自己的生命周期,并能接收输入事件。&/li&&li&我们能在Activity运行时动态地添加或删除Fragment。&/li&&/ul&&blockquote&Android 3.0系统只针对平板电脑,且闭源,那时候针对手机和针对平板是两套源代码,后来Android 4.0时整合了手机和平板的源码,因此市面上很难看到Android 3.0系统。&/blockquote&&p&Fragment的优势有以下几点:&/p&&ul&&li&模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。&/li&&li&可重用(Reusability):多个Activity可以重用一个Fragment。&/li&&li&可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。&/li&&/ul&&figure&&img src=&https://pic1.zhimg.com/v2-0bcab7a07ee40e54f1c6eef_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&350& data-rawheight=&350& class=&content_image& width=&350&&&/figure&&p&Fragment核心的类有:&/p&&ul&&li&Fragment:Fragment的基类,任何创建的Fragment都需要继承该类。&/li&&li&FragmentManager:管理和维护Fragment。他是抽象类,具体的实现类是FragmentManagerImpl。&/li&&li&FragmentTransaction:对Fragment的添加、删除等操作都需要通过事务方式进行。他是抽象类,具体的实现类是BackStackRecord。&/li&&/ul&&p&Nested Fragment(Fragment内部嵌套Fragment的能力)是Android 4.2提出的,support-fragment库可以兼容到1.6。通过&code&getChildFragmentManager()&/code&能够获得管理子Fragment的FragmentManager,在子Fragment中可以通过&code&getParentFragment()&/code&获得父Fragment。&/p&&h2&基本使用&/h2&&p&这里给出Fragment最基本的使用方式。首先,创建继承Fragment的类,名为Fragment1:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-8f01f5bd0b63f4def9ae2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1488& data-rawheight=&850& class=&origin_image zh-lightbox-thumb& width=&1488& data-original=&https://pic3.zhimg.com/v2-8f01f5bd0b63f4def9ae2_r.jpg&&&/figure&&p&Fragment有很多可以复写的方法,其中最常用的就是&code&onCreateView()&/code&,该方法返回Fragment的UI布局,需要注意的是&code&inflate()&/code&的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加,则会抛如下异常:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ccfcdc9b7623025bfeeb2673_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1620& data-rawheight=&48& class=&origin_image zh-lightbox-thumb& width=&1620& data-original=&https://pic2.zhimg.com/v2-ccfcdc9b7623025bfeeb2673_r.jpg&&&/figure&&p&如果在创建Fragment时要传入参数,必须要通过&code&setArguments(Bundle bundle)&/code&方式添加,而不建议通过为Fragment添加带参数的构造函数,因为通过&code&setArguments()&/code&方式添加,在由于内存紧张导致Fragment被系统杀掉并恢复(re-instantiate)时能保留这些数据。官方建议如下:&/p&&blockquote&It is strongly recommended that subclasses do not have other constructors with parameters, since these constructors will not be called when the fragment is re-instantiated.&/blockquote&&p&我们可以在Fragment的&code&onAttach()&/code&中通过&code&getArguments()&/code&获得传进来的参数,并在之后使用这些参数。如果要获取Activity对象,不建议调用&code&getActivity()&/code&,而是在&code&onAttach()&/code&中将Context对象强转为Activity对象。&/p&&p&创建完Fragment后,接下来就是把Fragment添加到Activity中。在Activity中添加Fragment的方式有两种:&/p&&ul&&li&静态添加:在xml中通过&code&&fragment&&/code&的方式添加,缺点是一旦添加就不能在运行时删除。&/li&&li&动态添加:运行时添加,这种方式比较灵活,因此建议使用这种方式。&/li&&/ul&&p&虽然Fragment能在XML中添加,但是这只是一个语法糖而已,Fragment并不是一个View,而是和Activity同一层次的。&/p&&p&这里只给出动态添加的方式。首先Activity需要有一个容器存放Fragment,一般是FrameLayout,因此在Activity的布局文件中加入FrameLayout:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-be99c31f57990b4dbedd8b9b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&612& data-rawheight=&198& class=&origin_image zh-lightbox-thumb& width=&612& data-original=&https://pic1.zhimg.com/v2-be99c31f57990b4dbedd8b9b_r.jpg&&&/figure&&p&然后在&code&onCreate()&/code&中,通过以下代码将Fragment添加进Activity中。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-903f73aa55470daac435a852_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1072& data-rawheight=&226& class=&origin_image zh-lightbox-thumb& width=&1072& data-original=&https://pic3.zhimg.com/v2-903f73aa55470daac435a852_r.jpg&&&/figure&&p&这里需要注意几点:&/p&&ul&&li&因为我们使用了support库的Fragment,因此需要使用&code&getSupportFragmentManager()&/code&获取FragmentManager。&/li&&li&&code&add()&/code&是对Fragment众多操作中的一种,还有&code&remove()&/code&, &code&replace()&/code&等,第一个参数是根容器的id(FrameLayout的id,即”@id/container”),第二个参数是Fragment对象,第三个参数是fragment的tag名,指定tag的好处是后续我们可以通过&code&Fragment1 frag = getSupportFragmentManager().findFragmentByTag(&f1&)&/code&从FragmentManager中查找Fragment对象。&/li&&li&在一次事务中,可以做多个操作,比如同时做&code&add().remove().replace()&/code&。&/li&&li&&code&commit()&/code&操作是异步的,内部通过&code&mManager.enqueueAction()&/code&加入处理队列。对应的同步方法为&code&commitNow()&/code&,&code&commit()&/code&内部会有&code&checkStateLoss()&/code&操作,如果开发人员使用不当(比如&code&commit()&/code&操作在&code&onSaveInstanceState()&/code&之后),可能会抛出异常,而&code&commitAllowingStateLoss()&/code&方法则是不会抛出异常版本的&code&commit()&/code&方法,但是尽量使用&code&commit()&/code&,而不要使用&code&commitAllowingStateLoss()&/code&。&/li&&li&&code&addToBackStack(&fname&)&/code&是可选的。FragmentManager拥有回退栈(BackStack),类似于Activity的任务栈,如果添加了该语句,就把该事务加入回退栈,当用户点击返回按钮,会回退该事务(回退指的是如果事务是add(frag1),那么回退操作就是remove(frag1));如果没添加该语句,用户点击返回按钮会直接销毁Activity。&/li&&li&Fragment有一个常见的问题,即Fragment重叠问题,这是由于Fragment被系统杀掉,并重新初始化时再次将fragment加入activity,因此通过在外围加if语句能判断此时是否是被系统杀掉并重新初始化的情况。&/li&&/ul&&p&Fragment有个常见的异常:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-dbce71ae64cf8eb043d59_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1362& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&1362& data-original=&https://pic3.zhimg.com/v2-dbce71ae64cf8eb043d59_r.jpg&&&/figure&&p&该异常出现的原因是:commit()在onSaveInstanceState()后调用。首先,onSaveInstanceState()在onPause()之后,onStop()之前调用。onRestoreInstanceState()在onStart()之后,onResume()之前。&/p&&p&因此避免出现该异常的方案有:&/p&&ul&&li&不要把Fragment事务放在异步线程的回调中,比如不要把Fragment事务放在AsyncTask的onPostExecute(),因此onPostExecute()可能会在onSaveInstanceState()之后执行。&/li&&li&逼不得已时使用commitAllowingStateLoss()。&/li&&/ul&&h2&生命周期&/h2&&p&Fragment的生命周期和Activity类似,但比Activity的生命周期复杂一些,基本的生命周期方法如下图:&/p&&figure&&img src=&https://pic7.zhimg.com/v2-a5a7bce47bcfca873535_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&400& data-rawheight=&354& class=&content_image& width=&400&&&/figure&&p&解释如下:&/p&&ul&&li&onAttach():Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArguments()获取参数。&/li&&li&onCreate():Fragment被创建时调用。&/li&&li&onCreateView():创建Fragment的布局。&/li&&li&onActivityCreated():当Activity完成onCreate()时调用。&/li&&li&onStart():当Fragment可见时调用。&/li&&li&onResume():当Fragment可见且可交互时调用。&/li&&li&onPause():当Fragment不可交互但可见时调用。&/li&&li&onStop():当Fragment不可见时调用。&/li&&li&onDestroyView():当Fragment的UI从视图结构中移除时调用。&/li&&li&onDestroy():销毁Fragment时调用。&/li&&li&onDetach():当Fragment和Activity解除关联时调用。&/li&&/ul&&p&上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。&/p&&p&因为Fragment是依赖Activity的,因此为了讲解Fragment的生命周期,需要和Activity的生命周期方法一起讲,即Fragment的各个生命周期方法和Activity的各个生命周期方法的关系和顺序,如图:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ddaa39a7db4ebca4e6a7f1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&952& data-rawheight=&1131& class=&origin_image zh-lightbox-thumb& width=&952& data-original=&https://pic4.zhimg.com/v2-ddaa39a7db4ebca4e6a7f1_r.jpg&&&/figure&&p&我们这里举个例子来理解Fragment生命周期方法。功能如下:共有两个Fragment:F1和F2,F1在初始化时就加入Activity,点击F1中的按钮调用replace替换为F2。&/p&&p&当F1在Activity的onCreate()中被添加时,日志如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-05ba6579254e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&636& data-rawheight=&852& class=&origin_image zh-lightbox-thumb& width=&636& data-original=&https://pic1.zhimg.com/v2-05ba6579254e_r.jpg&&&/figure&&p&可以看出:&/p&&ul&&li&Fragment的onAttach()-&onCreate()-&onCreateView()-&onActivityCreated()-&onStart()都是在Activity的onStart()中调用的。&/li&&li&Fragment的onResume()在Activity的onResume()之后调用。&/li&&/ul&&p&接下去分两种情况,分别是不加addToBackStack()和加addToBackStack()。&/p&&p&1、当点击F1的按钮,调用replace()替换为F2,且不加addToBackStack()时,日志如下:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-aef9c7468242_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&660& data-rawheight=&784& class=&origin_image zh-lightbox-thumb& width=&660& data-original=&https://pic4.zhimg.com/v2-aef9c7468242_r.jpg&&&/figure&&p&可以看到,F1最后调用了onDestroy()和onDetach()。&/p&&p&2、当点击F1的按钮,调用replace()替换为F2,且加addToBackStack()时,日志如下:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-db7e9a3dbed50b30cb637a91b6deae69_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&610& data-rawheight=&666& class=&origin_image zh-lightbox-thumb& width=&610& data-original=&https://pic2.zhimg.com/v2-db7e9a3dbed50b30cb637a91b6deae69_r.jpg&&&/figure&&p&可以看到,F1被替换时,最后只调到了onDestroyView(),并没有调用onDestroy()和onDetach()。当用户点返回按钮回退事务时,F1会调onCreateView()-&onStart()-&onResume(),因此在Fragment事务中加不加addToBackStack()会影响Fragment的生命周期。&/p&&p&FragmentTransaction有一些基本方法,下面给出调用这些方法时,Fragment生命周期的变化:&/p&&ul&&li&add(): onAttach()-&…-&onResume()。&/li&&li&remove(): onPause()-&…-&onDetach()。&/li&&li&replace(): 相当于旧Fragment调用remove(),新Fragment调用add()。&/li&&li&show(): 不调用任何生命周期方法,调用该方法的前提是要显示的Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为true。&/li&&li&hide(): 不调用任何生命周期方法,调用该方法的前提是要显示的Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为false。&/li&&li&detach(): onPause()-&onStop()-&onDestroyView()。UI从布局中移除,但是仍然被FragmentManager管理。&/li&&li&attach(): onCreateView()-&onStart()-&onResume()。&/li&&/ul&&h2&Fragment实现原理和Back Stack&/h2&&p&我们知道Activity有任务栈,用户通过startActivity将Activity加入栈,点击返回按钮将Activity出栈。Fragment也有类似的栈,称为回退栈(Back Stack),回退栈是由FragmentManager管理的。默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment事务加入回退栈,则可以加入&code&addToBackStack(&&)&/code&。如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回按钮会回滚Fragment事务。&/p&&p&我们将通过最常见的Fragment用法,讲解Back Stack的实现原理:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-fc5ecb67e3047bfaf235a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&702& data-rawheight=&142& class=&origin_image zh-lightbox-thumb& width=&702& data-original=&https://pic3.zhimg.com/v2-fc5ecb67e3047bfaf235a_r.jpg&&&/figure&&p&上面这个代码的功能就是将Fragment加入Activity中,内部实现为:创建一个BackStackRecord对象,该对象记录了这个事务的全部操作轨迹(这里只做了一次add操作,并且加入回退栈),随后将该对象提交到FragmentManager的执行队列中,等待执行。&/p&&p&BackStackRecord类的定义如下:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-9dbd359be8e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1502& data-rawheight=&74& class=&origin_image zh-lightbox-thumb& width=&1502& data-original=&https://pic4.zhimg.com/v2-9dbd359be8e_r.jpg&&&/figure&&p&从定义可以看出,BackStackRecord有三重含义:&/p&&ul&&li&继承了FragmentTransaction,即是事务,保存了整个事务的全部操作轨迹。&/li&&li&实现了BackStackEntry,作为回退栈的元素,正是因为该类拥有事务全部的操作轨迹,因此在popBackStack()时能回退整个事务。&/li&&li&继承了Runnable,即被放入FragmentManager执行队列,等待被执行。&/li&&/ul&&p&先看第一层含义,&code&getSupportFragmentManager.beginTransaction()&/code&返回的就是BackStackRecord对象,代码如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-003a2ed2ae_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&724& data-rawheight=&136& class=&origin_image zh-lightbox-thumb& width=&724& data-original=&https://pic1.zhimg.com/v2-003a2ed2ae_r.jpg&&&/figure&&p&BackStackRecord类包含了一次事务的整个操作轨迹,是以链表形式存在的,链表的元素是Op类,表示其中某个操作,定义如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fc9b56dd659dc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&830& data-rawheight=&230& class=&origin_image zh-lightbox-thumb& width=&830& data-original=&https://pic1.zhimg.com/v2-fc9b56dd659dc_r.jpg&&&/figure&&p&我们来看下具体场景下这些类是怎么被使用的,比如我们的事务做add操作。add函数的定义:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-039d25a2c8687bf4adc4b196ec01e59d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1252& data-rawheight=&154& class=&origin_image zh-lightbox-thumb& width=&1252& data-original=&https://pic1.zhimg.com/v2-039d25a2c8687bf4adc4b196ec01e59d_r.jpg&&&/figure&&p&doAddOp()方法就是创建Op对象,并加入链表,定义如下:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-dce21e4aceaf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1314& data-rawheight=&278& class=&origin_image zh-lightbox-thumb& width=&1314& data-original=&https://pic2.zhimg.com/v2-dce21e4aceaf_r.jpg&&&/figure&&p&addOp()是将创建好的Op对象加入链表,定义如下:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-35f6a89cd0b95b3e554a80ea436e029a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&546& data-rawheight=&332& class=&origin_image zh-lightbox-thumb& width=&546& data-original=&https://pic1.zhimg.com/v2-35f6a89cd0b95b3e554a80ea436e029a_r.jpg&&&/figure&&p&addToBackStack(“”)是将mAddToBackStack变量记为true,在commit()中会用到该变量。&code&commit()&/code&是异步的,即不是立即生效的,但是后面会看到整个过程还是在主线程完成,只是把事务的执行扔给主线程的Handler,commit()内部是&code&commitInternal()&/code&,实现如下:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ce040bdd8727fbc2c1c3fb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1088& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&1088& data-original=&https://pic4.zhimg.com/v2-ce040bdd8727fbc2c1c3fb_r.jpg&&&/figure&&p&如果mAddToBackStack为true,则调用&code&allocBackStackIndex(this)&/code&将事务添加进回退栈,FragmentManager类的变量&code&ArrayList&BackStackRecord& mBackStackI&/code&就是回退栈。实现如下:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b09c45c9d19bd556b87703_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&922& data-rawheight=&284& class=&origin_image zh-lightbox-thumb& width=&922& data-original=&https://pic1.zhimg.com/v2-b09c45c9d19bd556b87703_r.jpg&&&/figure&&p&在&code&commitInternal()&/code&中,&code&mManager.enqueueAction(this, allowStateLoss);&/code&是将BackStackRecord加入待执行队列中,定义如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-09442caa7577617fca32_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1306& data-rawheight=&354& class=&origin_image zh-lightbox-thumb& width=&1306& data-original=&https://pic1.zhimg.com/v2-09442caa7577617fca32_r.jpg&&&/figure&&p&mPendingActions就是前面说的待执行队列,&code&mHost.getHandler()&/code&就是主线程的Handler,因此Runnable是在主线程执行的,mExecCommit的内部就是调用了&code&execPendingActions()&/code&,即把mPendingActions中所有积压的没被执行的事务全部执行。执行队列中的事务会怎样被执行呢?就是调用BackStackRecord的&code&run()&/code&方法,&code&run()&/code&方法就是执行Fragment的生命周期函数,还有将视图添加进container中。&/p&&p&与&code&addToBackStack()&/code&对应的是&code&popBackStack()&/code&,有以下几种变种:&/p&&ul&&li&popBackStack():将回退栈的栈顶弹出,并回退该事务。&/li&&li&popBackStack(String name, int flag):name为addToBackStack(String name)的参数,通过name能找到回退栈的特定元素,flag可以为0或者FragmentManager.POP_BACK_STACK_INCLUSIVE,0表示只弹出该元素以上的所有元素,POP_BACK_STACK_INCLUSIVE表示弹出包含该元素及以上的所有元素。这里说的弹出所有元素包含回退这些事务。&/li&&li&popBackStack()是异步执行的,是丢到主线程的MessageQueue执行,popBackStackImmediate()是同步版本。&/li&&/ul&&p&我们通过讲解Demo1来更清晰地了解回退栈的使用。功能如下:共有三个Fragment:F1, F2, F3,F1在初始化时就加入Activity,点击F1中的按钮跳转到F2,点击F2的按钮跳转到F3,点击F3的按钮回退到F1。&/p&&p&在Activity的onCreate()中,将F1加入Activity中:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-12b6bad552ac6d36b265_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&820& data-rawheight=&154& class=&origin_image zh-lightbox-thumb& width=&820& data-original=&https://pic4.zhimg.com/v2-12b6bad552ac6d36b265_r.jpg&&&/figure&&p&F1按钮的onClick()内容如下:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-caed_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&814& data-rawheight=&156& class=&origin_image zh-lightbox-thumb& width=&814& data-original=&https://pic4.zhimg.com/v2-caed_r.jpg&&&/figure&&p&F2按钮的onClick()如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8ff4f9c1cbc243b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&818& data-rawheight=&156& class=&origin_image zh-lightbox-thumb& width=&818& data-original=&https://pic1.zhimg.com/v2-8ff4f9c1cbc243b_r.jpg&&&/figure&&p&F3按钮的onClick()如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ab86a3bdfabbcef08a4ea3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1572& data-rawheight=&84& class=&origin_image zh-lightbox-thumb& width=&1572& data-original=&https://pic1.zhimg.com/v2-ab86a3bdfabbcef08a4ea3_r.jpg&&&/figure&&p&这样就完成了整个界面的跳转逻辑。&/p&&p&这里补充一个点,getSupportFragmentManager().findFragmentByTag()是经常用到的方法,他是FragmentManager的方法,FragmentManager是抽象类,FragmentManagerImpl是继承FragmentManager的实现类,他的内部实现是:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-2b1ce8bca032a4dd9c6bad_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&834& data-rawheight=&730& class=&origin_image zh-lightbox-thumb& width=&834& data-original=&https://pic3.zhimg.com/v2-2b1ce8bca032a4dd9c6bad_r.jpg&&&/figure&&p&从上面看到,先从mAdded中查找是否有该Fragment,如果没找到,再从mActive中查找是否有该Fragment。mAdded是已经添加到Activity的Fragment的集合,mActive不仅包含mAdded,还包含虽然不在Activity中,但还在回退栈中的Fragment。&/p&&h2&Fragment通信&/h2&&p&&b&Fragment向Activity传递数据&/b&&/p&&p&首先,在Fragment中定义接口,并让Activity实现该接口(具体实现省略):&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6a1adbea540ffaac40d69ed_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&994& data-rawheight=&140& class=&origin_image zh-lightbox-thumb& width=&994& data-original=&https://pic4.zhimg.com/v2-6a1adbea540ffaac40d69ed_r.jpg&&&/figure&&p&在Fragment的onAttach()中,将参数Context强转为OnFragmentInteractionListener对象:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-1d2f5f02b3277afcbd57d14b72b4ceeb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1034& data-rawheight=&314& class=&origin_image zh-lightbox-thumb& width=&1034& data-original=&https://pic4.zhimg.com/v2-1d2f5f02b3277afcbd57d14b72b4ceeb_r.jpg&&&/figure&&p&并在Fragment合适的地方调用&code&mListener.onItemClick(&hello&)&/code&将”hello”从Fragment传递给Activity。&br&&/p&&p&&b&FABridge&/b&&/p&&p&由于通过接口的方式从Fragment向Activity进行数据传递比较麻烦,需要在Fragment中定义interface,并让Activity实现该interface,FABridge通过注解的形式免去了这些定义。&/p&&p&在build.gradle中添加依赖:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-8cee273a69a786d834da9d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&920& data-rawheight=&104& class=&origin_image zh-lightbox-thumb& width=&920& data-original=&https://pic2.zhimg.com/v2-8cee273a69a786d834da9d_r.jpg&&&/figure&&p&首先定义方法ID,这里为FAB_ITEM_CLICK,接着在Activity中定义接口:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-906beeed57968d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&882& data-rawheight=&158& class=&origin_image zh-lightbox-thumb& width=&882& data-original=&https://pic2.zhimg.com/v2-906beeed57968d_r.jpg&&&/figure&&p&最后,在Fragment中,通过以下形式调用”ID=FAB_ITEM_CLICK”的方法(该方法可能在Activity中,也可能在任何类中):&/p&&figure&&img src=&https://pic3.zhimg.com/v2-0be8c4e67f66acab2c75db7d0f3cc63d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1178& data-rawheight=&76& class=&origin_image zh-lightbox-thumb& width=&1178& data-original=&https://pic3.zhimg.com/v2-0be8c4e67f66acab2c75db7d0f3cc63d_r.jpg&&&/figure&&p&&b&Activity向Fragment传递数据&/b&&/p&&p&Activity向Fragment传递数据比较简单,获取Fragment对象,并调用Fragment的方法即可,比如要将一个字符串传递给Fragment,则在Fragment中定义方法:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8e0c8a7ca656fb18ee661cacf3f0b08d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&592& data-rawheight=&124& class=&origin_image zh-lightbox-thumb& width=&592& data-original=&https://pic1.zhimg.com/v2-8e0c8a7ca656fb18ee661cacf3f0b08d_r.jpg&&&/figure&&p&并在Activity中调用&code&fragment.setString(&hello&)&/code&即可。&/p&&h2&Fragment之间通信&/h2&&p&由于Fragment之间是没有任何依赖关系的,因此如果要进行Fragment之间的通信,建议通过Activity作为中介,不要Fragment之间直接通信。&/p&&h2&DialogFragment&/h2&&p&DialogFragment是Android 3.0提出的,代替了Dialog,用于实现对话框。他的优点是:即使旋转屏幕,也能保留对话框状态。&/p&&p&如果要自定义对话框样式,只需要继承DialogFragment,并重写onCreateView(),该方法返回对话框UI。这里我们举个例子,实现进度条样式的圆角对话框。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-798eebbaf9070588eabd13644a1cfdbd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1576& data-rawheight=&460& class=&origin_image zh-lightbox-thumb& width=&1576& data-original=&https://pic1.zhimg.com/v2-798eebbaf9070588eabd13644a1cfdbd_r.jpg&&&/figure&&p&进度条动画我们使用Lottie实现,Lottie动画从这里找到。使用非常方便,只需要下载JSON动画文件,然后在XML中写入:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-2ecccdec302abc188ef82da_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&920& data-rawheight=&220& class=&origin_image zh-lightbox-thumb& width=&920& data-original=&https://pic3.zhimg.com/v2-2ecccdec302abc188ef82da_r.jpg&&&/figure&&p&然后通过下面代码显示对话框:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ada9c2c80e0f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1042& data-rawheight=&128& class=&origin_image zh-lightbox-thumb& width=&1042& data-original=&https://pic1.zhimg.com/v2-ada9c2c80e0f_r.jpg&&&/figure&&p&为了实现圆角,除了在onCreateView()中把背景设为透明,还需要对UI加入背景:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-8b47c8c0dc47e43eebe16f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&984& data-rawheight=&192& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&https://pic2.zhimg.com/v2-8b47c8c0dc47e43eebe16f_r.jpg&&&/figure&&h2&ViewPager+Fragment相关&/h2&&p&&b&基本使用&/b&&/p&&p&ViewPager是support v4库中提供界面滑动的类,继承自ViewGroup。PagerAdapter是ViewPager的适配器类,为ViewPager提供界面。但是一般来说,通常都会使用PagerAdapter的两个子类:FragmentPagerAdapter和FragmentStatePagerAdapter作为ViewPager的适配器,他们的特点是界面是Fragment。&/p&&blockquote&在support v13和support v4中都提供了FragmentPagerAdapter和FragmentStatePagerAdapter,区别在于:support v13中使用android.app.Fragment,而support v4使用android.support.v4.app.Fragment。一般都使用support v4中的FragmentPagerAdapter和FragmentStatePagerAdapter。&/blockquote&&p&默认,ViewPager会缓存当前页相邻的界面,比如当滑动到第2页时,会初始化第1页和第3页的界面(即Fragment对象,且生命周期函数运行到onResume()),可以通过setOffscreenPageLimit(count)设置离线缓存的界面个数。&/p&&p&FragmentPagerAdapter和FragmentStatePagerAdapter需要重写的方法都一样,常见的重写方法如下:&/p&&ul&&li&&code&public FragmentPagerAdapter(FragmentManager fm)&/code&: 构造函数,参数为FragmentManager。如果是嵌套Fragment场景,子PagerAdapter的参数传入getChildFragmentManager()。&/li&&li&&code&Fragment getItem(int position)&/code&: 返回第position位置的Fragment,必须重写。&/li&&li&&code&int getCount()&/code&: 返回ViewPager的页数,必须重写。&/li&&li&&code&Object instantiateItem(ViewGroup container, int position)&/code&: container是ViewPager对象,返回第position位置的Fragment。&/li&&li&&code&void destroyItem(ViewGroup container, int position, Object object)&/code&: container是ViewPager对象,object是Fragment对象。&/li&&li&&code&getItemPosition(Object object)&/code&: object是Fragment对象,如果返回POSITION_UNCHANGED,则表示当前Fragment不刷新,如果返回POSITION_NONE,则表示当前Fragment需要调用&code&destroyItem()&/code&和&code&instantiateItem()&/code&进行销毁和重建。 默认情况下返回POSITION_UNCHANGED。&/li&&/ul&&p&&b&懒加载&/b&&/p&&p&懒加载主要用于ViewPager且每页是Fragment的情况,场景为微信主界面,底部有4个tab,当滑到另一个tab时,先显示”正在加载”,过一会才会显示正常界面。&/p&&p&默认情况,ViewPager会缓存当前页和左右相邻的界面。实现懒加载的主要原因是:用户没进入的界面需要有一系列的网络、数据库等耗资源、耗时的操作,预先做这些数据加载是不必要的。&/p&&p&这里懒加载的实现思路是:用户不可见的界面,只初始化UI,但是不会做任何数据加载。等滑到该页,才会异步做数据加载并更新UI。&/p&&p&这里就实现类似微信那种效果,整个UI布局为:底部用PagerBottomTabStrip项目实现,上面是ViewPager,使用FragmentPagerAdapter。逻辑为:当用户滑到另一个界面,首先会显示正在加载,等数据加载完毕后(这里用睡眠1秒钟代替)显示正常界面。&/p&&p&ViewPager默认缓存左右相邻界面,为了避免不必要的重新数据加载(重复调用&code&onCreateView()&/code&),因为有4个tab,因此将离线缓存的半径设置为3,即&code&setOffscreenPageLimit(3)&/code&。&/p&&p&懒加载主要依赖Fragment的&code&setUserVisibleHint(boolean isVisible)&/code&方法,当Fragment变为可见时,会调用&code&setUserVisibleHint(true)&/code&;当Fragment变为不可见时,会调用&code&setUserVisibleHint(false)&/code&,且该方法调用时机:&/p&&ul&&li&&code&onAttach()&/code&之前,调用&code&setUserVisibleHint(false)&/code&。&/li&&li&&code&onCreateView()&/code&之前,如果该界面为当前页,则调用&code&setUserVisibleHint(true)&/code&,否则调用&code&setUserVisibleHint(false)&/code&。&/li&&li&界面变为可见时,调用&code&setUserVisibleHint(true)&/code&。&/li&&li&界面变为不可见时,调用&code&setUserVisibleHint(false)&/code&。&/li&&/ul&&p&懒加载Fragment的实现:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-59fc11bb0b8d8145490c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1498& data-rawheight=&1318& class=&origin_image zh-lightbox-thumb& width=&1498& data-original=&https://pic1.zhimg.com/v2-59fc11bb0b8d8145490c_r.jpg&&&/figure&&p&&b&注意点:&/b&&/p&&ul&&li&在Fragment中有两个变量控制是否需要做数据加载:&/li&&ul&&li&mIsPrepared:表示UI是否准备好,因为数据加载后需要更新UI,如果UI还没有inflate,就不需要做数据加载,因为&code&setUserVisibleHint()&/code&会在&code&onCreateView()&/code&之前调用一次,如果此时调用,UI还没有inflate,因此不能加载数据。&/li&&li&mIsInited:表示是否已经做过数据加载,如果做过了就不需要做了。因为&code&setUserVisibleHint(true)&/code&在界面可见时都会调用,如果滑到该界面做过数据加载后,滑走,再滑回来,还是会调用&code&setUserVisibleHint(true)&/code&,此时由于mIsInited=true,因此不会再做一遍数据加载。&/li&&/ul&&/ul&&p&&br&&/p&&ul&&li&lazyLoad():懒加载的核心类,在该方法中,只有界面可见(getUserVisibleHint()==true)、UI准备好(mIsPrepared==true)、过去没做过数据加载(mIsInited==false)时,才需要调&code&loadData()&/code&做数据加载,数据加载做完后把mIsInited置为true。&/li&&/ul&&p&布局XML主要分两个container,一个是初始显示的状态,即R.id.container_empty,当数据加载完成,就显示R.id.container:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ebf6bb0b46c39f65a32dd86fa423ea9a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&545& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/v2-ebf6bb0b46c39f65a32dd86fa423ea9a_r.jpg&&&/figure&&h2&相关阅读&/h2&&p&&a href=&https://link.zhihu.com/?target=https%3A//cloud.tencent.com/developer/article/1035471& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android终端上视频转GIF的实现及GIF质量讨论&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//cloud.tencent.com/developer/article/1039390& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何使用 scikit-learn 为机器学习准备文本数据&/a&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//cloud.tencent.com/developer/article/1035563& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android图像处理 - 高斯模糊的原理及实现&/a&&/p&&hr&&p&此文已由作者授权云加社区发布,转载请注明&a href=&https://link.zhihu.com/?target=https%3A//cloud.tencent.com/developer/article/1035535& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&文章出处&/a&&/p&
欢迎大家前往,获取更多腾讯海量技术实践干货哦~由
发布在云+社区 作者简介:damonxia(夏正冬),天天P图Android工程师下文中Demo的源代码地址:。基本概念Fragment,简称碎片,是Android 3.0(API 11)提出的,为…
&p&大家收藏一下这篇文章,这是所有课程的目录。&/p&&h2&第一周:&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&进制及计算机表示&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&进制习题课&/a&,进一步介绍进制的知识&/p&&p&第三节课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&Java语言的品味(一)&/a&,通过static和final关键字讲解Java在关键字使用上的选择和考量。&/p&&p&第四节课:小密圈&a href=&https://link.zhihu.com/?target=https%3A//wx.xiaomiquan.com/mweb/views/joingroup/join_group.html%3Fgroup_id%3D%26secret%3D3v8pextw4kz53tpbns53ewxg1846d6hf%26extra%3Ddb69e06ad0196e1abb057aec& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&进击的Java新人&/a&私有课程。作业review。作业的点评发在小密圈里了。圈子里的朋友,请记得查看。&/p&&p&第五节课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java语言的品味(二) &/a&&/p&&h2&第二周:&/h2&&p&周前准备:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&使用gradle创建工程&/a&&/p&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java中的设计模式:适配与装饰&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&Java语言的品味(三)&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&数据结构(一):栈&/a&&/p&&p&第四课:小密圈私有课程。第二周作业review。&/p&&p&第五课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&用栈进行表达式求值&/a&&/p&&h2&第三周:&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&深入理解函数调用(上)&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&深入理解函数谳用(下)&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&递归下降做表达式求值&/a&&/p&&p&第四课:小密圈私有课程。题目讲评。&/p&&p&第五课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&位操作&/a&&/p&&h2&第四周:&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&链表&/a&&/p&&p&第二课:小密圈私有课程。链表习题讲评。&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&数据结构(三):队列&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&泛型&/a&&/p&&p&第五课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&数据结构(四):Java中的容器&/a&&/p&&h2&第五周:&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&数据结构(五):二叉树&/a&&/p&&p&课外阅读:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&谈递归时,我们在谈什么&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&数据结构(六):二叉树的遍历&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&迭代器模式&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&二叉树的删除和应用举例&/a&&/p&&p&第五课:小密圈私有课程,作业讲评&/p&&h2&第六周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&平衡二叉树&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&代码实现平衡二叉树&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&红黑树&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&红黑树(二):删除&/a&&/p&&h2&第七周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&红黑树(三):TreeMap源码解析&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&Unicode字符集与UTF-8编码&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&哈希表&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&HashMap源码解析&/a&&/p&&h2&第八周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&Java网络编程(一)&/a& &/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&分层网络协议&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java网络编程(二):套接字&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/?refer=hinus& class=&internal&&多线程编程基础&/a& &/p&&h2&第九周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java反射&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Class对象&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&代理模式 &/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&动态代理&/a&&/p&&h2&第十周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&面向对象编程(一) &/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&面向对象编程(二) &/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&排序算法 &/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&面向对象编程(三) &/a&&/p&&p&第五课:作业讲评&/p&&h2&第十一周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&算法(一):贪心&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&数据结构:堆&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&堆排序和PriorityQueue源码解析&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&算法设计(二):分治 &/a&&/p&&p&第五课:作业讲评&/p&&h2&第十二周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&强大的二分法 &/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/?group_id=632640& class=&internal&&快速排序&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&归并排序&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&map-reduce中的分治思想 &/a&&/p&&h2&第十三周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/?group_id=226560& class=&internal&&计数排序&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&基数排序&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&构建自己的RPC&/a& &/p&&p&第四课:序列化与反序列化&/p&&h2&第十四周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&多线程服务端&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&多线程的内幕&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&线程的共享互斥&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&纯函数和CAS&/a&&/p&&h2&第十五周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Atomic变量&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&线程池&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&工厂模式&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&线程池的结构和原理&/a&&/p&&h2&第十六周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&nio(1):buffer&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&nio(2):channel&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java NIO(3): IO模型&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java NIO(4): 阻塞与非阻塞&/a&&/p&&h2&第十七周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java NIO(5): IO多路复用&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java NIO(6): Selector&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/?group_id=677504& class=&internal&&Java NIO (7):Epoll版的Selector&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java NIO(8) : 异步模型之状态机&/a&&/p&&h2&第十八周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java NIO(9) : 状态机&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java NIO(10): 异步模型之Callback&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Direct Buffer&/a&&/p&&p&第四课:Direct Buffer的回收(待GC课程完成后补充)&/p&&h2&第十九周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&FileChannel的基本操作&/a& &/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&内存映射(memory map) &/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&FileChannel的map &/a&&/p&&h2&第二十周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&协程,高并发IO的终级杀器(1)&/a& &/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&协程,高并发IO的终极杀器(2) &/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&协程,高并发IO终极杀器(3)&/a&&/p&&h2&第二十一周&/h2&&p&第一课 : &a href=&https://zhuanlan.zhihu.com/p/?group_id=288320& class=&internal&&图算法:图的表达&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&图的广度优先搜索&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&习题课:八数码问题(上)&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&习题课:八数码问题(下)&/a&&/p&&h2&第二十二周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&图的深度优先搜索&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&DFS构造全排列&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&垃圾回收与图算法&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&图的非递归遍历&/a&&/p&&h2&第二十三周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&垃圾回收:基本概念&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&GC算法之引用计数&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Python的引用计数&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&C++智能指针(上)&/a&&/p&&h2&第二十四周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&C++智能指针(下)&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Copy GC(1) : 基本原理&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Copy GC(2) : 非递归的遍历&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Copy GC(3) : JVM中的实现&/a&&/p&&h2&第二十五周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Copy GC(4) : parallel scavenge&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Copy GC(5): Parallel GC(下)&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&WeakReference&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&弱引用拾遗&/a&&/p&&h2&第二十六周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&WeakReference vs. SoftReference&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&PhantomReference & Cleaner&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&finalize方法&/a&&/p&&h2&第二十七周&/h2&&p&第一课:GIT的使用(动手操作,小密圈专有课程)&/p&&h2&第二十八周&/h2&&p&第一课:Gradle的使用(动手操作,小密圈专用课程)&/p&&h2&第二十九周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Tracing GC(1)&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Tracing GC(2)&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Tracing GC(3): mark & compaction&/a&&/p&&h2&第三十周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&分代式垃圾回收(1)&/a&&/p&&h2&第三十二周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&单例模式&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&类型识别&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&访问者模式&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&C++的访问者模式&/a&&/p&&h2&第三十三周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Http协议&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&用Java实现的web server(1)&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java Web Server(2)&/a&&/p&&p&第四课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java Web Server(3)&/a&&/p&&h2&第三十四周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Java Web Server(4) :Servlet&/a&&/p&&h2&第三十六周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&数据结构:线段树&/a&&/p&&h2&第三十八周&/h2&&p&第一课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&线程安全的单例类&/a&&/p&&p&第二课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&用Atomic实现锁&/a&&/p&&p&第三课:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&用Atomic实现可以等待的锁&/a&&/p&&p&=============更多精彩内容,请关注我的个人公众号===============&/p&&p&&a href=&https://link.zhihu.com/?target=http%3A//www.jianshu.com/p/dcb& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&我的公众号&/a&&/p&&p&&/p&
大家收藏一下这篇文章,这是所有课程的目录。第一周:第一课:第二课:,进一步介绍进制的知识第三节课:,通过static和final关键字讲解Java在关键字使用上的选择和考量。第四节课:小密圈私…
&p&真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读Andoid系统源码,也包括阅读各种优秀的开源库。&/p&&br&&b&一、 阅读源码的准备&/b&&ol&&li&Java基础:上层framework以及App层都是采用Java语法;&br&&/li&&li&C/C++基础:Android的jni/native层代码采用C++,Linux 采用C;&br&&/li&&li&Linux:Android内核基于Linux的,了解Linux相关知识对深入掌握Android还是很有必要。&/li&&li&Git:Android源码采用git和repo进行管理;&/li&&li&Make:Android源码采用Make系统编译,源码系统中会看到很多Android.mk之类的文件;&/li&&li&Source Insight:这绝对是看源码的神器;可以在Java、C++、C代码之间无缝衔接;&/li&&li&Eclipse:熟悉常用快捷键,工欲善其事必先利其器;虽然Source Insight很方便,但由于对Eclipse的熟悉感,对于framework Java层面的代码,我还是更习惯用Eclipse来看,对于Native代码以及linux代码则采用Source Insight来看;&/li&&li&Android Studio:这是Google官方支持的App开发环境,关于Android Studiod使用教程;&/li&&li&Google Drawings:这是画图工具,Gityuan博客中的文章都是采用Google Drawing完成,比如&a href=&//link.zhihu.com/?target=http%3A//gityuan.com//binder-prepare/%23binder-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Binder开篇&/a&文中的图。&/li&&li&StarUML:这是类图,Gityuan博客文章的类图和流程图都是采用StarUML完成,比如&a href=&//link.zhihu.com/?target=http%3A//gityuan.com//app-process-create/%23forkandspecialize-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&理解Android进程创建流程&/a&文中时序图。&/li&&/ol&&b&二、 阅读源码的姿态&/b&&br&&br&&p&阅读源码绝不是从源码工程按顺序一个个的文件,从首行看到尾行。正确而高效地阅读源码的姿态应该是以某一个主线为起点,从上层往底层,不断地追溯,在各个模块、文件、方法之间来回跳转,反复地阅读,理清整个流程的逻辑。同时带着思考去看源码,尝试去揣测作者的用意,去理解代码的精妙之处,去思考代码可能存在的缺陷,去总结优秀的代码设计思想。下面说说我在阅读Android源码过程常涉及的库。&/p&&br&&p&&b&三、阅读Android源码&/b&&br&&/p&&br&&p&以Android开机过程为主线,展开一系列的文章 &a href=&//link.zhihu.com/?target=http%3A//gityuan.com/android/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android开篇&/a&,如下图:&/p&&figure&&img src=&https://pic2.zhimg.com/509bfcda94f84079bcc9_b.jpg& data-rawwidth=&817& data-rawheight=&728& class=&origin_image zh-lightbox-thumb& width=&817& data-original=&https://pic2.zhimg.com/509bfcda94f84079bcc9_r.jpg&&&/figure&&br&&br&&p&Android系统源码&a href=&//link.zhihu.com/?target=https%3A//android.googlesource.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android.googlesource.com&/a&,这是Google官方源码,国内无法直接访问,需要翻墙,对于一个程序员来说具备翻墙的能力是非常有必要的。&/p&&p&Android源码中包含的库非常多,下面列举我在看Android源码过程中涉及比较多,也是比较常看的一些库:&br&&/p&&ul&&li&&a href=&//link.zhihu.com/?target=https%3A//android.googlesource.com/platform/packages/apps/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android/platform/packages/apps&/a&:Android自带的app,比如Email,Camera, Music等,对于应用开发工程师主要关注的目录;&br&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//android.googlesource.com/platform/frameworks/base/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android/platform/frameworks/base&/a&: Java framework,这是framework工程师看得最多的目录;&br&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//android.googlesource.com/platform/frameworks/native/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android/platform/frameworks/native&/a&:Native framework&br&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//android.googlesource.com/platform/art/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android/platform/art&/a&:Art虚拟机&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//android.googlesource.com/kernel/common/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android/kernel/common&/a&:Android内核,这是驱动工程师最关注的模块;&br&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//android.googlesource.com/platform/system/core/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android/platform/system/core&/a& :核心系统&br&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//android.googlesource.com/platform/libcore/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&android/platform/libcore&/a&:平台的lib库&/li&&/ul&&p&另外,对于无法翻墙的朋友来说,还可以通过 &a href=&//link.zhihu.com/?target=https%3A//github.com/android& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&github.com/android&/a&下载Android源码,这是从Google官方源码的镜像同步而来的。&/p&&br&&b&四、 现有资源&/b&&br&&br&牛顿曾曰过一句名言:“如果我看得更远一点的话,是因为我站在巨人的肩膀上”,这句话很具有实用价值,千万不要一上来就一头扎进源码的世界,小心你会进入二次元世界,处于混沌状态,一定要合理利用现有资源。&p&Android 系统源码分析&/p&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/innost%3Fviewmode%3Dcontents& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Innost的专栏&/a&&/li&&ul&&li&邓凡平前辈所写博客,条例有序,覆盖了Android系统大部分内容;&/li&&li&《深入理解Android》 (卷I,卷II,卷III)&br&&/li&&/ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/luoshengyang/article/details/8923485& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&老罗的Android之旅&/a&:&/li&&ul&&li&罗升阳前辈所写博客,从各个层面介绍Android系统;&/li&&li&《Android系统源代码情景分析 》&/li&&/ul&&li&&a href=&//link.zhihu.com/?target=http%3A//gityuan.com/android/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gityuan源码分析&/a&&br&&/li&&ul&&li&对于邓凡平和罗升阳两位前辈的博客基于Android 2.x或4.x,目前Android已发展到Android 6.0。不管Android如何变化,其核心思维变化并没有很大,所以两位前辈的博客还是很有值得学习和参考的地方。话又说回来,Android经过了几个大版本的迭代,无论是从代码结构还是整体逻辑仍有不少变化。故博主计划写一关于Android 6.0源码系列的博文。&br&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//weibo.com/gityuan& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Gityuan&/a&作为Android界新秀,能力尚不及很多前辈,有一颗乐于分享的心,有一份痴于Android的品质,有一种坚持的态度,已经并还在努力奋斗的道路上...&/li&&/ul&&/ul&&br&-------------------------------------------------分割线-------------------------------------------------------------------&br&&br&&b&更多关于Android学习篇,见知乎文章 &a href=&http://zhuanlan.zhihu.com/p/& class=&internal&&如何自学Android?&/a&&/b&
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读Andoid系统源码,也包括阅读各种优秀的开源库。 一、 阅读源码的准备Java基础:上层framework以及App层都是采用Java语法; C/C++基础:Android的jni/native层代码采用C++,Linux 采用C; Linux:Android…
&p&作者:谷哥的小弟&/p&&p&链接:&a href=&https://link.zhihu.com/?target=https%3A//www.nowcoder.com/discuss/65623& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&再见,2017,你好,2018_笔经面经_牛客网&/a&&/p&&p&来源:牛客网&/p&&p&&br&&/p&&p&一直想写一篇年终总结的,但是又不知道写点什么,感觉没有什么可总结的,但是今年有很多事情还是值得回顾纪念的,之后再来看这些东西应该会感触颇多。2017对我来说是值得回味的一年,可以用三个词来概括,成长、成果、成熟。这一年有太多不顺心的事情,也有很多值得纪念的时刻。对于我一个即将离开大学校园走上社会的大学生来说,2017的很多经历都是弥足珍贵的。&/p&&p&我从今年年初就开始准备找工作的事情了,一开始我还是充满激情与信心的。但是事情往往不会像希望的那般发展,我找实习的经历是相当惨的,这里就不详细写了,不然写完就是我的血泪史。除此之外,从二月底就要开始准备实验室的纳新,,因为这是实验室每年最重要的一件事,当时正赶上找实习,那段时间真的是累,身心俱疲,我是边复习,边投简历,边准备纳新的很多资料,从横幅、海报、视频、各种申请资料到整体流程。每个细节都要自己过一遍,到自己满意,也要大家满意才行。直到三月底所有的准备工作都完成了,纳新结束后才有所缓解。当时实验室已经有大神同学拿到了实习offer,我又开始全身心投入到复习的状态中,慢慢的,拿到offer的同学越来越多,而我还在准备面试,一开始是一面挂,后来就是二面挂,反正就是总差那么一点,期间总共面了阿里(内推)、微信(内推)、美团、去哪、腾讯、阿里,除了阿里和腾讯是二面挂之外,其他都是一面挂,相当惨烈,现在想想,那会自己是真的菜。然后到五月底实习基本就结束了,那会实验室有将近一半人拿到了实习offer,然后我那段时间情绪就很低落。之后跟学长学姐聊天,然后开始重新准备,因为秋招才是最重要的。那会在牛客网看一些面经,意识到自己的不足,然后开始准备强化,每天在LintCode刷题,一边做,一边思考,一边整理,然后差不多有一个多月,到七月底的时候基本上把LintCode上Easy的都做完了(&a href=&https://link.zhihu.com/?target=https%3A//github.com/xiyouZmt/LintCode& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LintCode&/a&)。然后秋招也已经开始了。&/p&&p&年终总结好像写跑题了,,,算了,接着写吧,应该也没几个人看。&/p&&p&我以为我在暑假的准备,在秋招开始后会有所成效,然鹅剧情又没像希望的那般发展。不过还是有成效的,秋招的公司没有太多一面挂的,好多都是二面挂,从8月初的CVTE、360、好未来、美团到九月份的各种大厂,从九月初的天天笔试,到月中开始的天天面试,有时候一天好多场,那种感觉很微妙,从开始的期待到后来的担心,再到后来的失望以及绝望。有时候就在想,找不到工作就回家搬砖吧,但还是会每天爬起来奔波于各个酒店去面试,越往后越慌,大厂越来越少,真的快坚持不下去。到九月底的时候,还一个offer都没有(其实那会粗粮已经过了,只不过HR还没有联系我),后来十一收假后的第一天,粗粮的另一个部门捞了我一把,然后这次剧本终于按照希望的那样发展了,一个下午,两面技术,三个小时,结束战斗。过了两天HR就给了口头offer,第二天正式offer就来了。然后请老铁们吃了顿饭,庆祝,结束!&/p&&p&一星期后,粗粮开始面的那个部门终于联系我了,是MIUI系统组,然后又欣慰了一把,对于一个Android Developer来说,MIUI系统组是一个神圣的地方啊。然后我就去了啊。&/p&&p&年终总结写成这样我也是服,写到这就可以结束了吧,当然不是,其实也差不多,写成这样了就要再写一点有价值的东西,下面我把面试中遇到的Android和Java相关问题罗列下,这些只是我遇到的问题的总结,并不代表Android方面的面试问题,希望能对其他Android developer有所帮助。&/p&&p&&br&&/p&&h2&Android 知识点总结&/h2&&p&&br&&/p&&ol&&li&Activity生命周期,启动模式,保存数据的方式,需要注意各种情况下的处理,结合Fragment,两者与Service通信&/li&&li&Service启动方式,几种方式之间的区别,start和bind的区别,IntentService,与Activity之间的通信,Service保活&/li&&li&Broadcast的注册方式,使用以及与其它相关框架的区别,比如EventBus&/li&&li&ContentProvider的使用及特点(不是很常见,但是需要注意)&/li&&li&ListView、RecyclerView的优化,原理,以及结合相关设计模式的实现过程(观察者模式)&/li&&li&Bitmap的缓存以及压缩处理,结合相关框架,如Glide,Picasso,每一种的特点以及它们的区别&/li&&li&View的事件体系,工作原理,滑动冲突,代理等相关内容,涉及滑动,绘制,事件分发,自定义View,并结合相关设计模式等&/li&&li&数据存储,SharedPreference,File,SQLite,区别及特点&/li&&li&网络请求框架,HttpUrlConnection,Okhttp,Retrofit等框架的特点,原理,与原生的区别,从请求方式,携带header等方面考虑。结合项目以及设计模式&/li&&li&多线程间的数据交互,Handler原理,深入到Native层,以及其它的解决方案,比如Retrofit,AsyncTask实现&/li&&li&线程池特点,使用场景以及执行任务时的大致规则,结合网络框架&/li&&li&动画的种类,每一种的实现以及它们的区别&/li&&li&Android中进程的优先级,以及每一种进程的使用场景&/li&&li&设计模式,结合源码以及框架,比如观察者(ListView,Eventbus),责任链(OkHttp,View事件分发),项目结构MVC,MVP等&/li&&li&常用框架实现,网络请求:OkHttp、Retrofit,图片加载:ImageLoader、Glide、Picasso,事件驱动:Eventbus,动态绑定:ButterKnife&/li&&li&进程间通信,AIDL,Mesenger,File,Socket,Binder,每一种的实现以及底层原理,结合操作系统中进程间通信,管道、信号量、共享内存的对应关系(参考 &a href=&https://link.zhihu.com/?target=http%3A//gityuan.com& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&gityuan.com&/span&&span class=&invisible&&&/span&&/a&)&/li&&li&系统启动流程、App启动流程、应用程序进程启动流程、Activity启动流程(参考源码情景分析,&a href=&https://link.zhihu.com/?target=http%3A//gityuan.com& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&gityuan.com&/span&&span class=&invisible&&&/span&&/a&)&/li&&li&性能调优,结合布局优化,内存分配,缓存处理等方面&/li&&li&JNI编程,插件化相关知识,动态加载以及RN插件&/li&&li&热修复实现以及相关框架AndFix,Tinker&/li&&/ol&&p&&br&&/p&&h2&Java知识点总结&/h2&&p&&br&&/p&&ol&&li&内部类,抽象类与接口的区别 &/li&&li&集合源码,ArrayList,LinkedList,HashMap,Hashtable,LinkedHashMap,ConcurrentHashMap &/li&&li&线程及应用,线程同步 &/li&&li&锁及其优化,synchronized、volatile &/li&&li&内存分区,垃圾回收,垃圾回收器,内存分配 &/li&&li&类加载机制,内存模型 &/li&&li&反射应用及原理 &/li&&li&高并发 &/li&&/ol&&p&到这就差不多完了,2018,首先希望能每天都能充实一点,不管是在工作上还是在生活上,然后希望生活乐趣多一点,代码bug少一点。最后,自己知道就好。&/p&&p&&br&&/p&&p&---有点不像面经的年终总结,祝大家2018,充实,快乐。&/p&
作者:谷哥的小弟链接:来源:牛客网 一直想写一篇年终总结的,但是又不知道写点什么,感觉没有什么可总结的,但是今年有很多事情还是值得回顾纪念的,之后再来看这些东西应该会感触颇多。2017对我来说是值得回味的…
&p&在做设计时,好的素材和灵感往往都不可缺少。下面就来介绍一些你可以寻找到素材和灵感的网站,当你设计进行不下去的时候,不如去这些网站看一看。&/p&&h2&icon 素材&/h2&&h2&iconfinder&/h2&&p&&a href=&//link.zhihu.com/?target=https%3A//www.iconfinder.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iconfinder&/a& 应该是大家最熟悉的一个 icon 素材网站了,这个网站有将近 200 万的 icon 素材,有免费和收费的 icon。只要将你想要寻找的 icon 关键词,输入到网站的搜索框进行搜索,说不定就能找到你心中理想的 icon 素材了。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-274bfbc1cb6f9_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic2.zhimg.com/v2-274bfbc1cb6f9_r.jpg&&&/figure&&p&iconfinder 可以下载素材格式很多,其中包括最常用的矢量格式 SVG 和最常用的位图格式 PNG,而且,iconfinder 还推出了一个可以在线编辑 icon 的 icon editor 功能,可以将找到的素材,根据自己的需求,在线完成编辑。&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-b5a9a5aa25_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic2.zhimg.com/v2-b5a9a5aa25_r.jpg&&&/figure&&h2&iconfont&/h2&&p&&a href=&//link.zhihu.com/?target=http%3A//www.iconfont.cn/plus& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iconfont&/a& 是阿里妈妈 MUX 倾力打造的矢量图标管理、交流平台。 设计师可以将设计的 icon 素材上传,供大家下载多种格式的素材。也可以将 icon 转换为字体格式,方便前端工程师使用。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-18763f39fbae202ae8b122ea27a323af_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic4.zhimg.com/v2-18763f39fbae202ae8b122ea27a323af_r.jpg&&&/figure&&p&可以单个下载和批量下载 icon,下载的 icon 格式包括常用的 SVG,AI,PNG,同时还可以对下载的素材颜色进行自定义。批量下载时,将喜欢的 icon 加入购物车,再点击网站右上角的购物车,就可以批量下载了,批量下载还可以下载对应的 icon 代码,供 WEB 前端,iOS,Android 平台的工程师使用。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-59de29a3b_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic4.zhimg.com/v2-59de29a3b_r.jpg&&&/figure&&h2&设计素材&/h2&&h2&Freepik&/h2&&p&&a href=&//link.zhihu.com/?target=http%3A//www.freepik.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Freepik&/a& 是一个可以下载免费矢量素材的网站,同时也可以找到 icon、PSD、和图片等资源。通过网站的搜索框,对想要的关键词进行搜索,就可以了。由于矢量素材可以不失真的放大和缩小、可以简单的拆分出想要的素材部分等特点,已经成为了下载素材的首选。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-bef67bfb6cbbcda39de11_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic2.zhimg.com/v2-bef67bfb6cbbcda39de11_r.jpg&&&/figure&&h2&Sketch App Sources&/h2&&p&&a href=&//link.zhihu.com/?target=https%3A//www.sketchappsources.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Sketch App Sources&/a& 是一个可以下载 Sketch 素材的网站,由于 Sketch 更擅长设计 icon 和网页及手机 UI,所以,这里的素材一般多为 icon 和网站及手机界面设计素材为主。需要做相关设计的小伙伴,可以来这个网站,找找有没有你需要的资源。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-677abdda27e7d2cc1493a06bce93262b_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic4.zhimg.com/v2-677abdda27e7d2cc1493a06bce93262b_r.jpg&&&/figure&&h2&颜色资源&/h2&&h2&Color Hunt&/h2&&p&&a href=&//link.zhihu.com/?target=http%3A//www.colorhunt.co/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Color Hunt&/a& 是一个提供颜色搭配的网站,网站每天更新一个新的颜色搭配,同时你也可以查看最热门、最流行或者随机查看颜色搭配。当你自己做设计,却不知道要用什么颜色时,来这里看看说不定会有意外收获。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f22ed40b4d395b6385d24_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic1.zhimg.com/v2-f22ed40b4d395b6385d24_r.jpg&&&/figure&&h2&Nippon Colors&/h2&&p&&a href=&//link.zhihu.com/?target=http%3A//nipponcolors.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Nippon Colors&/a& 是一个日本传统色系的网站,总共收录了 250 种颜色,并标注了每种颜色的名称。如果想要做一些日系设计,可以来这个网站寻找下,有没有你想要的颜色。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-40caa74f860a385bd5dc123_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic4.zhimg.com/v2-40caa74f860a385bd5dc123_r.jpg&&&/figure&&h2&设计灵感&/h2&&h2&lapa&/h2&&p&&a href=&//link.zhihu.com/?target=https%3A//www.lapa.ninja/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&lapa&/a& 是一个可以查看优秀网页设计的网站,这个网站不仅展示了网页的截图,还收录了每个网站的链接,方便直接访问。网站支持通过颜色或者网站类型来筛选查看结果,方便寻找自己所需要的网站设计风格。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-9cf7fa2fac5_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic2.zhimg.com/v2-9cf7fa2fac5_r.jpg&&&/figure&&h2&Reeoo&/h2&&p&&a href=&//link.zhihu.com/?target=http%3A//reeoo.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Reeoo&/a& 是一个集合了网页、App、设计师、icon 等优秀设计的网站。其中收录的网站、App、设计师都有对应的链接可以直接跳转,并且也可以通过颜色来查找想要的设计风格。这个网站是由国人搭建的,搭建的初衷其实是为了自己收集网页用的。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-b405b5d051_b.jpg& data-caption=&& data-rawwidth=&1120& data-rawheight=&708& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic2.zhimg.com/v2-b405b5d051_r.jpg&&&/figure&&p&(题图使用的配色来自 Color Hunt,icon 素材来自 iconfinder,矢量素材来自 freepik)&/p&
在做设计时,好的素材和灵感往往都不可缺少。下面就来介绍一些你可以寻找到素材和灵感的网站,当你设计进行不下去的时候,不如去这些网站看一看。icon 素材iconfinder 应该是大家最熟悉的一个 icon 素材网站了,这个网站有将近 200 万的 icon 素…
&p&通常软件技术的各种学习资源,书籍也好,课程也罢,其内容不外乎两种组织方式,对应地,也有两种学习方式。&/p&&p&第一种方式是依次学习特定技术领域中的各个知识与技术模块,我称之为“&b&分块学习法&/b&”,如下图所示:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-514e0bf5bfed2bd0051fff37cdc61bda_b.jpg& data-size=&normal& data-rawwidth=&705& data-rawheight=&331& class=&origin_image zh-lightbox-thumb& width=&705& data-original=&https://pic1.zhimg.com/v2-514e0bf5bfed2bd0051fff37cdc61bda_r.jpg&&&figcaption&软件技术学习之“分块学习法”&/figcaption&&/figure&&p&采用这种学习方式的好处是对某个子领域内的主要东西你一次就能了解个差不离,但弊端是你只得到了一些零散的知识模块,难有大用。&/p&&p&另一种方式则是“&b&项目驱动法&/b&”,以开发出某特定的示例项目或应用为中心,逐个地介绍开发这个示例要用到}

我要回帖

更多关于 天河新都会公寓 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信