-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
2104 lines (1810 loc) · 649 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title><![CDATA[资料/汇总]]></title>
<url>/2018/12/12/%E8%B5%84%E6%96%99:%E6%B1%87%E6%80%BB/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情.“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="Google"><a href="#Google" class="headerlink" title="Google"></a>Google</h3><table>
<thead>
<tr>
<th>网站名称</th>
<th>推荐理由</th>
</tr>
</thead>
<tbody>
<tr>
<td> <a href="https://www.google.com.hk/" target="_blank" rel="noopener"> <strong>Google</strong> </a></td>
<td>google</td>
</tr>
<tr>
<td> <a href="https://github.com/googlesamples" target="_blank" rel="noopener"> <strong>GoogleSaples</strong> </a></td>
<td>GoogleSaples</td>
</tr>
<tr>
<td> <a href="https://plus.google.com/" target="_blank" rel="noopener"> <strong>Google+</strong> </a></td>
<td>一个Google官网技术问答网站</td>
</tr>
<tr>
<td> <a href="https://developer.android.com/index.html" target="_blank" rel="noopener"> <strong>developer</strong> </a></td>
<td>官网 Android Studio使用指南</td>
</tr>
<tr>
<td> <a href="https://android.googlesource.com/?format=HTML" target="_blank" rel="noopener"> <strong>googlesource</strong> </a></td>
<td>Google Source 的Git仓库</td>
</tr>
</tbody>
</table>
<h3 id="推荐RxJava系列"><a href="#推荐RxJava系列" class="headerlink" title="推荐RxJava系列"></a>推荐RxJava系列</h3><table>
<thead>
<tr>
<th>名称</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td> <a href="https://github.com/ReactiveX" target="_blank" rel="noopener">RxJava Github</a></td>
<td>Github Rx系列</td>
</tr>
<tr>
<td> <a href="http://reactivex.io/intro.html" target="_blank" rel="noopener">RxJava</a></td>
<td>RxJava官网</td>
</tr>
<tr>
<td> <a href="http://reactivex.io/RxJava/javadoc/" target="_blank" rel="noopener">RxJava Doc</a></td>
<td>RxJava Doc</td>
</tr>
<tr>
<td> <a href="https://github.com/yuxingxin/RxJava-Essentials-CN" target="_blank" rel="noopener">RxJava 要点 中文翻译版</a></td>
<td>RxJava 中文翻译版</td>
</tr>
<tr>
<td> <a href="https://mcxiaoke.gitbooks.io/rxdocs/content/Intro.html" target="_blank" rel="noopener">ReactiveX 中文翻译</a></td>
<td>ReactiveX 中文翻译</td>
</tr>
<tr>
<td> <a href="https://github.com/kaushikgopal/RxJava-Android-Samples" target="_blank" rel="noopener">RxJava Samples</a></td>
<td>Rxjava Simples</td>
</tr>
<tr>
<td> <a href="https://mcxiaoke.gitbooks.io/rxdocs/content/" target="_blank" rel="noopener">ReactiveX/RxJava文档中文版</a></td>
<td>大神们在百忙之中翻译的文档,感谢开源。</td>
</tr>
<tr>
<td> <a href="http://reactivex.io/RxJava/javadoc/" target="_blank" rel="noopener">ReactiveX/RxJava官方API</a></td>
<td>ReactiveX/RxJava官方API</td>
</tr>
<tr>
<td> <a href="http://gank.io/post/560e15be2dca930e00da1083" target="_blank" rel="noopener">给 Android 开发者的 RxJava 详解</a></td>
<td>给 Android 开发者的 RxJava 详解 ,作者:扔物线</td>
</tr>
<tr>
<td> <a href="http://blog.csdn.net/lzyzsd/article/details/41833541/" target="_blank" rel="noopener">深入浅出RxJava</a></td>
<td>大头鬼写的Rxjava 系列</td>
</tr>
</tbody>
</table>
<h3 id="博客推荐"><a href="#博客推荐" class="headerlink" title="博客推荐"></a>博客推荐</h3><table>
<thead>
<tr>
<th>博客地址</th>
<th>博主信息</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="http://blog.csdn.net/guolin_blog" target="_blank" rel="noopener">郭霖</a></td>
<td>博主郭霖是大神, 人人都称”郭神”, 是第一行代码的作者, 博主在 CSDN 上所写的文章都非常值得学习</td>
</tr>
<tr>
<td><a href="http://blog.csdn.net/lmj623565791/" target="_blank" rel="noopener">张鸿洋</a></td>
<td>张鴻洋是 CSDN 博客专家, “洋神”, 他的每一篇博客都很值得大家去学习</td>
</tr>
<tr>
<td><a href="http://www.trinea.cn/" target="_blank" rel="noopener">Trinea</a></td>
<td>目前在滴滴负责 Android </td>
</tr>
<tr>
<td><a href="http://blog.csdn.net/xyz_lmn" target="_blank" rel="noopener">张兴业</a></td>
<td>张兴业同样也是 CSDN 博客专家</td>
</tr>
<tr>
<td><a href="http://blog.csdn.net/lzyzsd/" target="_blank" rel="noopener">大头鬼</a></td>
<td>hi大头鬼hi 是阿里巴巴集团的一名 Android 工程师, 写了一系列RXJava 资料。</td>
</tr>
<tr>
<td><a href="http://over140.cnblogs.com/" target="_blank" rel="noopener">农民伯伯</a></td>
<td>资深博客写手,他的博客非常值得一看。</td>
</tr>
<tr>
<td><a href="http://blog.csdn.net/singwhatiwanna" target="_blank" rel="noopener">任玉刚</a></td>
<td>《安卓开发艺术探索》作者。</td>
</tr>
<tr>
<td><a href="http://blog.csdn.net/Luoshengyang" target="_blank" rel="noopener">罗升阳</a></td>
<td>CSDN博客专家,《安卓系统源代码情景分析》。</td>
</tr>
<tr>
<td><a href="http://blog.csdn.net/shimiso?viewmode=contents" target="_blank" rel="noopener">袭烽</a></td>
<td>CSDN博客专家 袭烽</td>
</tr>
<tr>
<td><a href="http://blog.csdn.net/android_tutor?viewmode=contents" target="_blank" rel="noopener">Android_Tutor</a></td>
<td>CSDN博客专家 Android_Tutor的专栏</td>
</tr>
<tr>
<td><a href="http://jaeger.itscoder.com/" target="_blank" rel="noopener">写代码的猴子</a></td>
<td>技术总结、个人的感悟很不错哦</td>
</tr>
<tr>
<td><a href="http://fucknmb.com/archives/" target="_blank" rel="noopener">区长</a></td>
<td>技术总结、个人的感悟很不错哦</td>
</tr>
</tbody>
</table>
<h3 id="常用框架系列"><a href="#常用框架系列" class="headerlink" title="常用框架系列"></a>常用框架系列</h3><ul>
<li><a href="https://github.com/JakeWharton/DiskLruCache" target="_blank" rel="noopener">DiskLruCache</a> <!-- 图片加载框架 --></li>
<li><a href="https://github.com/facebook/fresco" target="_blank" rel="noopener">Fresco</a> </li>
<li><a href="https://github.com/square/picasso" target="_blank" rel="noopener">Picasso</a> </li>
<li><a href="https://github.com/wasabeef/picasso-transformations" target="_blank" rel="noopener">Picasso—transformations</a> </li>
<li><a href="https://github.com/bumptech/glide" target="_blank" rel="noopener">Glide</a> </li>
<li><a href="https://github.com/wasabeef/glide-transformations" target="_blank" rel="noopener">Glide—transformations</a> <!-- 网络请求 --></li>
<li><a href="https://github.com/square/okhttp" target="_blank" rel="noopener">Okhttp</a> </li>
<li><a href="https://github.com/square/retrofit" target="_blank" rel="noopener">Retrofit</a> </li>
<li><a href="https://github.com/mcxiaoke/android-volley" target="_blank" rel="noopener">volley</a> </li>
<li><a href="https://github.com/google/gson" target="_blank" rel="noopener">Gson</a> </li>
<li><a href="https://github.com/FasterXML/jackson" target="_blank" rel="noopener">jackson</a> </li>
<li><a href="https://github.com/greenrobot/greenDAO" target="_blank" rel="noopener">greendao</a> </li>
<li><a href="https://github.com/realm/realm-java" target="_blank" rel="noopener">realm</a> </li>
<li><a href="https://github.com/satyan/sugar" target="_blank" rel="noopener">Sugar</a> </li>
<li><a href="https://github.com/JakeWharton/butterknife" target="_blank" rel="noopener">ButterKnife</a> </li>
<li><a href="https://github.com/diogobernardino/WilliamChart" target="_blank" rel="noopener">WilliamChart</a> </li>
<li><a href="https://github.com/PhilJay/MPAndroidChart" target="_blank" rel="noopener">MPAndroidChart</a> </li>
<li><a href="https://github.com/greenrobot/EventBus" target="_blank" rel="noopener">EventBus</a> </li>
<li><a href="https://github.com/square/otto" target="_blank" rel="noopener">otto</a> <!--Rx 系列 --></li>
<li><a href="https://github.com/ReactiveX/RxJava" target="_blank" rel="noopener">RXjava</a> </li>
<li><a href="https://github.com/ReactiveX/RxAndroid" target="_blank" rel="noopener">RXAndroid</a> </li>
<li><a href="https://github.com/JakeWharton/RxBinding" target="_blank" rel="noopener">RXBinding</a> </li>
<li><a href="https://github.com/trello/RxLifecycle" target="_blank" rel="noopener">RxLifecycle</a> </li>
<li><a href="https://github.com/VictorAlbertos/RxCache" target="_blank" rel="noopener">RxCache</a> </li>
<li><a href="https://github.com/tbruyelle/RxPermissions" target="_blank" rel="noopener">RxPermissions</a></li>
<li><a href="https://github.com/orhanobut/logger" target="_blank" rel="noopener">logger</a> </li>
<li><a href="https://github.com/spf13/hugo" target="_blank" rel="noopener">Hugo</a> </li>
<li><a href="https://github.com/JakeWharton/timber" target="_blank" rel="noopener">Timber</a> </li>
<li><a href="https://github.com/mockito/mockito" target="_blank" rel="noopener">mockito</a> </li>
<li><a href="https://github.com/RobotiumTech/robotium" target="_blank" rel="noopener">robotium</a> </li>
<li><a href="https://github.com/facebook/stetho" target="_blank" rel="noopener">stetho</a> </li>
<li><a href="https://github.com/square/leakcanary" target="_blank" rel="noopener">leakcanary</a> <!-- google--></li>
<li><a href="https://github.com/google/dagger" target="_blank" rel="noopener">Dagger2</a> </li>
</ul>
<h3 id="开源库收集"><a href="#开源库收集" class="headerlink" title="开源库收集"></a>开源库收集</h3><ul>
<li><a href="https://github.com/wasabeef/awesome-android-ui" target="_blank" rel="noopener">awesome-android-ui</a></li>
<li><a href="https://github.com/wasabeef/awesome-android-libraries" target="_blank" rel="noopener">awesome-android-libraries</a></li>
<li><a href="http://alamkanak.github.io/android-libraries-and-resources/" target="_blank" rel="noopener">Android Libraries and Resources </a></li>
<li><a href="http://android-arsenal.com/" target="_blank" rel="noopener">Android Arsenal </a>(一个专门收集 android 开源库的网站, 网站经常更新)</li>
<li><a href="https://github.com/Trinea/android-open-project" target="_blank" rel="noopener">Android 开源项目汇总 </a>(Trinea 大神收集的)</li>
<li><a href="http://www.jcodecraeer.com/plus/list.php?tid=31" target="_blank" rel="noopener">泡在网上的日子</a></li>
<li><a href="http://www.android-gems.com/category" target="_blank" rel="noopener">Android 红宝石</a></li>
<li><a href="https://github.com/Ramotion" target="_blank" rel="noopener">Ramotion</a></li>
<li><a href="http://www.devlight.io/opensource" target="_blank" rel="noopener">opensource</a></li>
<li><a href="http://alamkanak.github.io/android-libraries-and-resources/" target="_blank" rel="noopener">Android Libraries and Resources</a></li>
<li><a href="http://codekk.com/open-source-project-analysis" target="_blank" rel="noopener">Android 开源项目源码分析 </a>(在懂得使用这些开源项目同时, 也应该了解当中的原理)</li>
</ul>
]]></content>
<categories>
<category> 总结 </category>
</categories>
<tags>
<tag> 总结 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[学习路线]]></title>
<url>/2018/01/11/Android:%E8%B7%AF%E7%BA%BF/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情,“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h4 id="Java基础"><a href="#Java基础" class="headerlink" title="Java基础"></a>Java基础</h4><ul>
<li>Java Object类方法</li>
<li>HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理</li>
<li>HashMap 和 HashTable 区别</li>
<li>HashCode 作用,如何重载hashCode方法</li>
<li>ArrayList与LinkList区别与联系</li>
<li>GC机制</li>
<li>Java反射机制,Java代理模式</li>
<li>Java泛型</li>
<li>Synchronized原理</li>
<li>Volatile实现原理</li>
<li>方法锁、对象锁、类锁的意义和区别</li>
<li>线程同步的方法:Synchronized、lock、reentrantLock分析</li>
<li>Java锁的种类: 公平锁、乐观锁、互斥锁、分段锁、偏向锁、自旋锁等</li>
<li>ThreadLocal的原理和用法</li>
<li>ThreadPool的用法和示例</li>
<li>wait()和sleep()的区别</li>
</ul>
<p><img src="/2018/01/11/Android:路线/juc_pic.png" alt=""></p>
<h4 id="Java高阶"><a href="#Java高阶" class="headerlink" title="Java高阶"></a>Java高阶</h4><ul>
<li>Java虚拟机,Java运行,Java GC机制(可达性分析法,引用计数法)</li>
<li>Java对象的完整生命周期</li>
<li>JVM内存模型</li>
<li>进程间通信,线程间通信</li>
<li>JVM类加载机制</li>
<li>Java引用类型</li>
<li>设计模式:除常用设计模式之外,特别的,反射机制,代理模式</li>
<li>HTTP协议和HTTPS协议</li>
<li>Socket协议,Socket实现长连接</li>
<li>TCP和UDP协议</li>
<li>HTTP协议中GET和POST的具体实现</li>
<li>序列化和反序列化</li>
<li>线程池的实现原理</li>
<li>数据库基础知识:多表查询、索引、数据库事务</li>
</ul>
<h4 id="Android-基础"><a href="#Android-基础" class="headerlink" title="Android 基础"></a>Android 基础</h4><ul>
<li>Application生命周期</li>
<li>Android Activity生命周期</li>
<li>Android Service、IntentService,Service和组件间通信</li>
<li>Activity的onNewIntent</li>
<li>Fragment的懒加载实现,参数传递与保存</li>
<li>ContentProvider实例详解</li>
<li>BroadcastReceiver使用总结</li>
<li>Android消息机制</li>
<li>Binder机制,共享内存实现原理</li>
<li>Android 事件分发机制</li>
<li>Android 多线程的实现:Thread、HandlerThread、AsyncTask、IntentService、RxJava</li>
<li>ActivityThread工作原理</li>
<li>嵌套滑动实现原理</li>
<li>RecyclerView与ListView(缓存原理,区别联系,优缺点)</li>
<li>View的绘制原理,自定义View,自定义ViewGroup</li>
<li>View、SurfaceView 与 TextureView</li>
<li>主线程Looper.loop为什么不会造成死循环</li>
<li>ViewPager的缓存实现</li>
<li>requestLayout,invalidate,postInvalidate区别与联系</li>
<li>AndroidP新特性</li>
<li>Android两种虚拟机</li>
<li>ADB常用命令</li>
<li>Asset目录与res目录的区别</li>
<li>Android SQLite的使用入门</li>
</ul>
<h4 id="Android开发高级"><a href="#Android开发高级" class="headerlink" title="Android开发高级"></a>Android开发高级</h4><ul>
<li>自定义LayoutManager,RecyclerView中如何自定义LayoutManager</li>
<li>VLayout实现原理,即如何自定义LayoutManager</li>
<li>Glide加载原理,缓存方案,LRU算法</li>
<li>Retrofit的实现与原理</li>
<li>OKHttp3的使用,网络请求中的Intercept</li>
<li>EventBus实现原理</li>
<li>ButterKnife实现原理</li>
<li>RxJava实现原理</li>
<li>Dagger依赖注入</li>
<li>热修复实现原理,解决方案</li>
<li>组件化原理和解决方案</li>
</ul>
<h4 id="面试-题目"><a href="#面试-题目" class="headerlink" title="面试/题目"></a>面试/题目</h4><ul>
<li>Activity 的生命周期?为什么Activity 要这么设计?这么设计有什么好处?</li>
<li>Android 于IOS 运行机制有哪些不同?</li>
<li>为什么Android 用起来没有IOS 流畅,为了让Android 系统更加流畅,应该从哪些方面做好</li>
<li>如何让Server不被杀死?</li>
<li>Android 系统分层,Library层起什么作用?</li>
<li>Android 自定义View 的工作原理和ListView的优化</li>
<li>MVC 设计模式在android 中的应用</li>
<li>Android android:layout_gravity=”” 和 android:gravity=”” 有什么区别</li>
<li>熟悉Android Fragment Activity Services Receiver Intent Provider</li>
<li>Android 界面布局绘制,UI动画,数据存储,网络通信,多线程编程,熟悉XML/JSON解析并对Socket 和Http/Tcp/IP访问有实际开发经验</li>
<li>熟悉 Volley GSON UIL AsyncHttpClient等</li>
<li>熟悉Android下网络通讯技术 了解(AIDL/IPC) 进程间通信、对Socket,Tcp/UDP 有一定的了解</li>
<li>熟悉掌握触控点击手势处理和Touch事件的分发机制,熟悉处理控件之父View触摸事件的传递</li>
<li>熟练掌握MVC/MVP框架熟悉单例模式,工厂模式,观察者模式,等常用的设计模式</li>
<li>熟练掌握hanlder消息机制,AsyncTask异步任务机制</li>
<li>熟练Material Design ripple circularreveal clipping RecyclerView CardView</li>
<li>单线程发消息、消息存到集合,发消息有先后顺序你会使用什么集合?为什么?</li>
<li>对于1-100的累积、你有什么好的方式?效率比较好?</li>
<li>是否存在i-1>1(i)为整数,若存在说出原因?</li>
<li>mvp</li>
<li>如何进行项目重构解耦的</li>
<li>okhttp 的原理。先重定向再查缓存?请求池?</li>
<li>RecyclerView 和 ListView 的区别?如果你自己实现 RecyclerView 的缓存池,怎么实现?</li>
<li>写一下 Http 报文的组成。如何判断哪部分是 body</li>
<li>EventBus 的原理。反射为什么耗时?Apt?</li>
<li>RxJava。如何自己实现 flatmap</li>
<li>service 的启动过程。start 和 bind 的生命周期和区别</li>
<li>垃圾回收。为什么新生代要用复制算法,效率高在哪里?为什么复制算法要分3块内存,直接在一块内存里复制不行吗?解释虚拟机栈?</li>
<li>合并两个有序数组</li>
</ul>
<p><img src="/2018/01/11/Android:路线/Android_pic.png" alt=""></p>
<p><img src="/2018/01/11/Android:路线/route.png" alt=""></p>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[android walle打包]]></title>
<url>/2017/05/10/android-walle%E6%89%93%E5%8C%85/</url>
<content type="html"><![CDATA[<p><strong>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情,“时光不倒带,岁月不重来”-致自己 ​​​​</strong></p>
<h2 id="多种渠道打包方式"><a href="#多种渠道打包方式" class="headerlink" title="多种渠道打包方式"></a>多种渠道打包方式</h2><p>公司项目之前使用美团打包方案、不支持V2签名升级签名工具Walle(瓦力),实现Android Signature V2 Scheme签名,一款不错的渠道包打包神器</p>
<blockquote>
<p><a href="https://source.android.com/security/apksigning" target="_blank" rel="noopener">”Android APK 签名方案“</a></p>
</blockquote>
<p><strong>Android 支持以下三种应用签名方案:</strong></p>
<ul>
<li>v1 方案:基于 JAR 签名。</li>
<li>v2 方案:<a href="https://source.android.com/security/apksigning/v2" target="_blank" rel="noopener">”APK 签名方案 v2”</a>(在 Android 7.0 中引入)</li>
<li>v3 方案:<a href="https://source.android.com/security/apksigning/v3" target="_blank" rel="noopener">”APK 签名方案 v3”</a>(在 Android 9 中引入)</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">APK签名方案v2是一种全文件签名方案,该方案能够发现对APK的受保护部分进行的所有更改,从而有助于加快验证速度并增强完整性保证。</span><br><span class="line"></span><br><span class="line">使用APK签名方案v2进行签名时,会在APK文件中插入一个APK签名分块,该分块位于“ZIP中央目录”部分之前并紧邻该部分。</span><br><span class="line"></span><br><span class="line">在“APK签名分块”内v2签名和签名者身份信息会存储在APK签名方案v2分块中。</span><br></pre></td></tr></table></figure>
<p><img src="/2017/05/10/android-walle打包/signature.png" alt=""></p>
<p><strong>上图签名前/签名后的APK</strong></p>
<p><strong>APK签名方案v2是在Android7.0(Nougat)中引入的,为了使APK可在Android6.0(Marshmallow)及更低版本的设备上安装,应先使用JAR签名功能对APK进行签名,然后再使用v2方案对其进行签名.</strong></p>
<blockquote>
<p><a href="https://tech.meituan.com/2017/01/13/android-apk-v2-signature-scheme.html" target="_blank" rel="noopener">”什么是Walle?“</a></p>
</blockquote>
<p>checkout 美团walle “<a href="https://github.com/Meituan-Dianping/walle.git"" target="_blank" rel="noopener">https://github.com/Meituan-Dianping/walle.git"</a></p>
<p><strong>>配置build.gradle</strong></p>
<p>在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">buildscript {</span><br><span class="line"> dependencies {</span><br><span class="line"> classpath 'com.meituan.android.walle:plugin:1.1.6'</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>并在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">apply plugin: 'walle'</span><br><span class="line"></span><br><span class="line">dependencies {</span><br><span class="line"> compile 'com.meituan.android.walle:library:1.1.6'</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>配置插件</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">walle {</span><br><span class="line"> // 指定渠道包的输出路径</span><br><span class="line"> apkOutputFolder = new File("${project.buildDir}/outputs/channels");</span><br><span class="line"> // 定制渠道包的APK的文件名称</span><br><span class="line"> apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';</span><br><span class="line"> // 渠道配置文件</span><br><span class="line"> channelFile = new File("${project.getProjectDir()}/channel")</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">apkOutputFolder:指定渠道包的输出路径, 默认值为new File("${project.buildDir}/outputs/apk")</span><br><span class="line"></span><br><span class="line">apkFileNameFormat:定制渠道包的APK的文件名称, 默认值为'${appName}-${buildType}-${channel}.apk'</span><br><span class="line">可使用以下变量:</span><br><span class="line"></span><br><span class="line">projectName - 项目名字</span><br><span class="line">appName - App模块名字</span><br><span class="line">packageName - applicationId (App包名packageName)</span><br><span class="line">buildType - buildType (release/debug等)</span><br><span class="line">channel - channel名称 (对应渠道打包中的渠道名字)</span><br><span class="line">versionName - versionName (显示用的版本号)</span><br><span class="line">versionCode - versionCode (内部版本号)</span><br><span class="line">buildTime - buildTime (编译构建日期时间)</span><br><span class="line">fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)</span><br><span class="line">flavorName - 编译构建 productFlavors 名</span><br><span class="line"></span><br><span class="line">channelFile:包含渠道配置信息的文件路径.</span><br></pre></td></tr></table></figure></p>
<p><strong>根据自己的需求使用具体的配置</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">walle {</span><br><span class="line"> // 指定渠道包的输出路径</span><br><span class="line"> apkOutputFolder = new File("${project.buildDir}/outputs/channels")</span><br><span class="line"> // 定制渠道包的APK的文件名称</span><br><span class="line"> apkFileNameFormat = '${appName}-${channel}-${buildType}-v${versionName}.apk'</span><br><span class="line"> // 渠道配置文件</span><br><span class="line"> channelFile = new File("${project.getProjectDir()}/channel")</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>复制walle simple项目 当前app目录下的渠道文件</strong></p>
<p>例如:内容如下<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">XIAOMI # 小米</span><br><span class="line">HUAWEI # 华为</span><br><span class="line">MEIZU # 魅族</span><br><span class="line">OPPO # oppo</span><br><span class="line">VIVO # vivo</span><br><span class="line">SAMSUNG # 三星</span><br><span class="line">LENOVO # 联想</span><br><span class="line">SMARTISAN # 锤子</span><br><span class="line">TXYYB # 应用宝</span><br><span class="line">m360 # 360</span><br><span class="line">BAIDU # 百度</span><br><span class="line">ANZHI # 安智</span><br><span class="line">ALI # 阿里</span><br><span class="line">SOUGOU # 搜狗</span><br></pre></td></tr></table></figure></p>
<p>如何生成渠道/以及更多的用法walle 文档很详细请参考github</p>
<p>生成渠道包 ./gradlew clean assembleReleaseChannels</p>
<p><img src="/2017/05/10/android-walle打包/chanel.png" alt=""></p>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[2016/总结]]></title>
<url>/2017/01/04/2016:%E6%80%BB%E7%BB%93/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情.“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">2016年转眼就过完了、时间飞快、这个年纪的自己感觉到了压力、盲目的学习、挣钱、一味地付出、没有多的成效、盲目的学习,最后感觉什么东西都不</span><br><span class="line"></span><br><span class="line">会、一无所获。不过看了几本书、确实要多读书看报、增长知识,古人云、活到老,学到老。</span><br></pre></td></tr></table></figure>
<h4 id="车"><a href="#车" class="headerlink" title="车"></a>车</h4><p>16年结束了、15年自己挣钱买了个车、贷款一年的时间自己17年初,贷款就返完了、很感谢这个车叫我知道什么是付出就有回报,来上海好几年了、当初看到我朋友的朋友、在火车站接他开个车、就想自己什么时间可以买个、不知不觉自己实现了来上海的第一个愿望、有幸的认识了奥迪A3车友会,这一年这个车给我带来了很多开心的事。</p>
<h4 id="书"><a href="#书" class="headerlink" title="书"></a>书</h4><p>上海这几年自己忙于工作、没事儿就想看看电影、颓废了两年、看到朋友不停地学习、自己感觉再不学习真的就要被淘汰了、今年买了10本书、前端、Android开发,设计、等、通过学习知道了自己的不足、自己慢慢的学习、世上无难事,只怕有心人,17年继续。</p>
<h4 id="结婚"><a href="#结婚" class="headerlink" title="结婚"></a>结婚</h4><p>时间好快一眨眼就到了结婚的年纪、老姐今年订婚了、老大不小了、感觉时间好快、真的有时会很无助,一年回去的时间算下来不到一个月,在家里面的时间少之又少、看到父母慢慢变白的头发、感觉自己回去时间太少了、17年争取带父母旅游一下去上海。</p>
<h4 id="总结一下自己"><a href="#总结一下自己" class="headerlink" title="总结一下自己"></a>总结一下自己</h4><p>一眨眼就是一年,无论留恋或期待,只希望今天的我能和今天之前的一切好好说声再见,未来的无论好坏,照样会到来,我深深相信我不再需要从别人那里得到前进的勇气和力量。哪怕对我来说有多难,我知道我也一样可以!为什么要头也不回地向前跑?因为没有未来的人,没资格聊从前。</p>
]]></content>
<categories>
<category> 总结 </category>
</categories>
<tags>
<tag> 总结 </tag>
</tags>
</entry>
<entry>
<title><![CDATA[WebView 处理File]]></title>
<url>/2016/08/15/webView-%E5%A4%84%E7%90%86File/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情,“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">在App开发中、内嵌WebView始终占有着一席之地、它能以较低的成本实现Android、iOS和Web的复用、也可以冠冕堂皇的突破苹果对热更新的封锁、</span><br><span class="line"></span><br><span class="line">然而便利性的同时、WebView的性能体验却备受质疑、导致很多客户端中需要动态更新等页面时不得不采用其他方案.</span><br><span class="line"></span><br><span class="line">以发展的眼光来看\功能的动态加载以及三端的融合将会是大趋势</span><br></pre></td></tr></table></figure>
<h4 id="字符串传输"><a href="#字符串传输" class="headerlink" title="字符串传输"></a>字符串传输</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">WebView和js交互其实就是字符串的传输,可以通过注入一个本地的JS文件作为JAVA和远端Js进行交互,通过改变window的IFrame的Src</span><br><span class="line">从而使得Android,web内核调用WebViewClient的shouldOverrideUrlLoading(WebView view, String url)方法、在这里面进行信息的拦截和处理</span><br><span class="line"></span><br><span class="line">JS</span><br><span class="line"> //产生IFrame并更改IFrame的Src</span><br><span class="line"> function LoadNative(url) {</span><br><span class="line"> if(!messagingIframe){</span><br><span class="line"> messagingIframe = doc.createElement('iframe');</span><br><span class="line"> messagingIframe.style.display = 'none';</span><br><span class="line"> window.document.documentElement.appendChild(messagingIframe);</span><br><span class="line"> }</span><br><span class="line"> messagingIframe.src = url;</span><br><span class="line"> console.log("调用"+document.getElementsByTagName('iframe').length);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line">JAVA:</span><br><span class="line"></span><br><span class="line"> boolean shouldOverrideUrlLoading(WebView view, String url){</span><br><span class="line"> //当拦截到我们定义的 ctjsbridge://就说明我们的数据来了需要处理了</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h4 id="初始化设置WebSeting"><a href="#初始化设置WebSeting" class="headerlink" title="初始化设置WebSeting"></a>初始化设置WebSeting</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">WebSettings settings = bridgeWebView.getSettings();</span><br><span class="line"> String userAgent = settings.getUserAgentString();</span><br><span class="line"> settings.setUserAgentString(userAgent + "member");</span><br><span class="line"> settings.setJavaScriptEnabled(true);</span><br><span class="line"> if (!WebNetUtils.checkNet(this)) {</span><br><span class="line"> settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);</span><br><span class="line"> } else {</span><br><span class="line"> settings.setCacheMode(WebSettings.LOAD_DEFAULT);</span><br><span class="line"> }</span><br><span class="line"> if (Build.VERSION.SDK_INT >= 21) {</span><br><span class="line"> bridgeWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> // 设置可以使用localStorage</span><br><span class="line"> settings.setDomStorageEnabled(true);</span><br><span class="line"> // 应用可以有缓存</span><br><span class="line"> String appCaceDir = this.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();</span><br><span class="line"> settings.setAppCachePath(appCaceDir);</span><br><span class="line"> settings.setAppCacheEnabled(true);</span><br><span class="line"> // 支持HTML的“viewport”标签或者使用wide viewport</span><br><span class="line"> settings.setUseWideViewPort(true);</span><br><span class="line"> settings.setLoadWithOverviewMode(true);</span><br><span class="line"> settings.setSaveFormData(false);</span><br><span class="line"> settings.setBuiltInZoomControls(false);</span><br><span class="line"> // 设置网页字体不跟随系统字体发生改变</span><br><span class="line"> settings.setTextZoom(100);</span><br><span class="line"> // 允许访问文件</span><br><span class="line"> settings.setAllowFileAccess(true);</span><br><span class="line"> // 启用数据库</span><br><span class="line"> settings.setDatabaseEnabled(true);</span><br><span class="line"> // 设置定位的数据库路径</span><br><span class="line"> String dir = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();</span><br><span class="line"> settings.setGeolocationDatabasePath(dir);</span><br><span class="line"> // 启用地理定位</span><br><span class="line"> settings.setGeolocationEnabled(true);</span><br></pre></td></tr></table></figure>
<h4 id="WebView-调用拍照-相册-图片选择"><a href="#WebView-调用拍照-相册-图片选择" class="headerlink" title="WebView 调用拍照/相册/图片选择"></a>WebView 调用拍照/相册/图片选择</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line">js支持从手机上传图片、各版本Android系统也都提供了相应的解决办法.</span><br><span class="line">在Android 4.*系统上面,开发者可以重写WebChromeClient的openFileChooser函数.</span><br><span class="line">在Android 5.0以上的系统,开发者可以重写WebChromeClient的onShowFileChooser函数.</span><br><span class="line"></span><br><span class="line">首先是Android不同系统的适配问题,对于4.*版本要重写openFileChooser方法、对于5.0以上版本要重写onShowFileChooser方法、</span><br><span class="line">注意二者的回调方式也不一样,4.*的回调参数类型是ValueCallback<Uri>、而5.0以上的回调参数类型是ValueCallback<Uri[]>、</span><br><span class="line">因此要声明两个回调参数变量,分别用来保存二者各自的回调信息</span><br><span class="line"></span><br><span class="line"> private ValueCallback<Uri> mUploadMessage;</span><br><span class="line"> private ValueCallback<Uri[]> mUploadMessages;</span><br><span class="line"></span><br><span class="line"> bridgeWebView.setWebChromeClient(new WebChromeClient() {</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public void onReceivedTitle(WebView view, String title) {</span><br><span class="line"> super.onReceivedTitle(view, title);</span><br><span class="line"> if (!TextUtils.isEmpty(view.getTitle()) && !view.getTitle().contains("http") && mITitle != null) {</span><br><span class="line"> mITitle.setTitle(view.getTitle());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public void onRequestFocus(WebView view) {</span><br><span class="line"> super.onRequestFocus(view);</span><br><span class="line"> view.requestFocus();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {</span><br><span class="line"> this.openFileChooser(uploadMsg, acceptType, null);</span><br><span class="line"> }</span><br><span class="line"> // 4.*版</span><br><span class="line"> public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {</span><br><span class="line"> mAcceptType = acceptType;</span><br><span class="line"> checkPermission();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {</span><br><span class="line"> callback.invoke(origin, true, false);</span><br><span class="line"> super.onGeolocationPermissionsShowPrompt(origin, callback);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> // 5.0以上版本</span><br><span class="line"> @Override</span><br><span class="line"> public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {</span><br><span class="line"> mUploadMessages = filePathCallback;</span><br><span class="line"> String[] acceptTypes = new String[0];</span><br><span class="line"> if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {</span><br><span class="line"> acceptTypes = fileChooserParams.getAcceptTypes();</span><br><span class="line"> }</span><br><span class="line"> mAcceptType = acceptTypes[0];</span><br><span class="line"> checkPermission();</span><br><span class="line"> return true;</span><br><span class="line"> }</span><br><span class="line"> });</span><br></pre></td></tr></table></figure>
<p>请求摄像头的权限</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">public static boolean requestCameraPermission(Activity activity) {</span><br><span class="line"> if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {</span><br><span class="line"> return true;</span><br><span class="line"> }</span><br><span class="line"> boolean has = ActivityCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;</span><br><span class="line"> if (has) {</span><br><span class="line"> ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, CAMERA);</span><br><span class="line"> }</span><br><span class="line"> return has;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">@Override</span><br><span class="line">public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {</span><br><span class="line"> // 图片视频类型</span><br><span class="line"> if (mAcceptType.equals("image/*")) {</span><br><span class="line"> selectPic();</span><br><span class="line"> } else if (mAcceptType.equals("video/*")) {</span><br><span class="line"> selectVideo();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h4 id="处理拍照-相册-图库选择图片Intent"><a href="#处理拍照-相册-图库选择图片Intent" class="headerlink" title="处理拍照/相册/图库选择图片Intent"></a>处理拍照/相册/图库选择图片Intent</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">private void selectPic() {</span><br><span class="line"> Intent i = new Intent(Intent.ACTION_GET_CONTENT);</span><br><span class="line"> i.addCategory(Intent.CATEGORY_OPENABLE);</span><br><span class="line"> i.setType("image/*");</span><br><span class="line"> Intent chooser = createChooseIntent(createCameraIntent(), createPicChooseIntent());</span><br><span class="line"> chooser.putExtra(Intent.EXTRA_INTENT, i);</span><br><span class="line"> WebActivity.this.startActivityForResult(chooser, FIREHOUSE_IMAGE_CODE);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public Intent createChooseIntent(Intent... intents) {</span><br><span class="line"> Intent chooser = new Intent(Intent.ACTION_CHOOSER);</span><br><span class="line"> chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);</span><br><span class="line"> chooser.putExtra(Intent.EXTRA_TITLE, "图片选择");</span><br><span class="line"> return chooser;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private Intent createCameraIntent() {</span><br><span class="line"> Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);</span><br><span class="line"> File externalDataDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);</span><br><span class="line"> File cameraDataDir = new File(externalDataDir.getAbsolutePath() + File.separator + "photos");</span><br><span class="line"> cameraDataDir.mkdirs();</span><br><span class="line"> mCameraFilePath = cameraDataDir.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".jpg";</span><br><span class="line"> openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));</span><br><span class="line"> return openCameraIntent;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> private Intent createPicChooseIntent() {</span><br><span class="line"> return new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI).setType("image/*");</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<h4 id="处理拍摄-视频选择Intent"><a href="#处理拍摄-视频选择Intent" class="headerlink" title="处理拍摄/视频选择Intent"></a>处理拍摄/视频选择Intent</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">private void selectVideo() {</span><br><span class="line"> Intent i = new Intent(Intent.ACTION_GET_CONTENT);</span><br><span class="line"> i.addCategory(Intent.CATEGORY_OPENABLE);</span><br><span class="line"> i.setType("video/*");</span><br><span class="line"> Intent chooser = createVideoIntent(createShootingIntent());</span><br><span class="line"> chooser.putExtra(Intent.EXTRA_INTENT, i);</span><br><span class="line"> startActivityForResult(chooser, FIREHOUSE_VIDEO_CODE);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> * 创建拍摄视频/Intent</span><br><span class="line"> *</span><br><span class="line"> * @param intents</span><br><span class="line"> * @return</span><br><span class="line"> */</span><br><span class="line">public Intent createVideoIntent(Intent... intents) {</span><br><span class="line"> Intent chooser = new Intent(Intent.ACTION_CHOOSER);</span><br><span class="line"> chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);</span><br><span class="line"> chooser.putExtra(Intent.EXTRA_TITLE, "视频选择");</span><br><span class="line"> return chooser;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> * 创建拍摄意图</span><br><span class="line"> *</span><br><span class="line"> * @return</span><br><span class="line"> */</span><br><span class="line">private Intent createShootingIntent() {</span><br><span class="line"> Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);</span><br><span class="line"> // 设置视频质量</span><br><span class="line"> takeVideoIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);</span><br><span class="line"> takeVideoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);</span><br><span class="line"> // 调用前置摄像头</span><br><span class="line"> takeVideoIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);</span><br><span class="line"> return takeVideoIntent;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h4 id="处理WebView-回调js-Callback-回调"><a href="#处理WebView-回调js-Callback-回调" class="headerlink" title="处理WebView 回调js Callback/回调"></a>处理WebView 回调js Callback/回调</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">@Override</span><br><span class="line"> protected void onActivityResult(int requestCode, int resultCode, Intent data) {</span><br><span class="line"> super.onActivityResult(requestCode, resultCode, data);</span><br><span class="line"> mRegister.onActivityResult(requestCode, resultCode, data);</span><br><span class="line"> // 图片</span><br><span class="line"> if (bridgeWebView != null && requestCode == FIREHOUSE_IMAGE_CODE) {</span><br><span class="line"> if (null != mUploadMessage) {</span><br><span class="line"> Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();</span><br><span class="line"> mUploadMessage.onReceiveValue(result);</span><br><span class="line"> mUploadMessage = null;</span><br><span class="line"> }</span><br><span class="line"> if (null != mUploadMessages) {</span><br><span class="line"> Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();</span><br><span class="line"> if (result == null) {</span><br><span class="line"> File file = new File(mCameraFilePath);</span><br><span class="line"> if (file.exists()) {</span><br><span class="line"> result = Uri.fromFile(file);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> if (result != null) {</span><br><span class="line"> mUploadMessages.onReceiveValue(new Uri[]{result});</span><br><span class="line"> } else {</span><br><span class="line"> mUploadMessages.onReceiveValue(null);</span><br><span class="line"> }</span><br><span class="line"> mUploadMessages = null;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> //视频</span><br><span class="line"> else if (bridgeWebView != null && requestCode == FIREHOUSE_VIDEO_CODE) {</span><br><span class="line"> if (null != mUploadMessage) {</span><br><span class="line"> Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();</span><br><span class="line"> mUploadMessage.onReceiveValue(result);</span><br><span class="line"> mUploadMessage = null;</span><br><span class="line"> }</span><br><span class="line"> if (null != mUploadMessages) {</span><br><span class="line"> Uri result = data == null || resultCode != Activity.RESULT_OK ? null : data.getData();</span><br><span class="line"> if (result != null) {</span><br><span class="line"> mUploadMessages.onReceiveValue(new Uri[]{result});</span><br><span class="line"> } else {</span><br><span class="line"> mUploadMessages.onReceiveValue(null);</span><br><span class="line"> }</span><br><span class="line"> mUploadMessages = null;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[android打包]]></title>
<url>/2016/08/01/android%E6%89%93%E5%8C%85/</url>
<content type="html"><![CDATA[<p><strong>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情,“时光不倒带,岁月不重来”-致自己 ​​​​</strong></p>
<h4 id="多种渠道打包方式"><a href="#多种渠道打包方式" class="headerlink" title="多种渠道打包方式"></a>多种渠道打包方式</h4><p>由于国内存在众多的android市场:产品在不同的渠道可能有不同的统计需求,为此android开发人员需要为每个应用市场发布一个安装包,这就涉及到了android的多渠道打包<br>学习下美团客户端打包经验,主要是利用在META-INF目录内添加空文件的方式,实现批量快速打包Android应用.</p>
<p><strong>1>实现原理</strong></p>
<p><strong>Android应用安装包apk文件其实是一个压缩文件,可以将后缀修改为zip直接解压,解压安装文件后会发现在根目录有一个META-INF目录,如果在META-INF目录内添加空文件,可以不用重新签名应用.<br>因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道.“采用这种方式,每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件即可.这种打包方式速度非常快.百十多个渠道不到一分钟就能打完.</strong></p>
<p><strong>2>实现步骤</strong></p>
<p>编写渠道号文件”channel.txt”文件内容如下:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">H5_Home </span><br><span class="line">XIAOMI </span><br><span class="line">HUAWEI </span><br><span class="line">MEIZU</span><br><span class="line">OPPO</span><br><span class="line">VIVO</span><br><span class="line">SAMSUNG</span><br><span class="line">LENOVO</span><br><span class="line">SMARTISAN</span><br><span class="line">TXYYB</span><br><span class="line">m360</span><br><span class="line">BAIDU</span><br><span class="line">ANZHI</span><br><span class="line">ALI</span><br><span class="line">SOUGOU </span><br><span class="line">pgyer</span><br></pre></td></tr></table></figure></p>
<p><strong>3>编写python脚本,实现解压缩apk文件,为META-INF目录添加文件,重新压缩apk文件等逻辑:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"># coding=utf-8</span><br><span class="line">import zipfile</span><br><span class="line">import shutil</span><br><span class="line">import os</span><br><span class="line"></span><br><span class="line">def delete_file_folder(src): </span><br><span class="line"> '''delete files and folders''' </span><br><span class="line"> if os.path.isfile(src): </span><br><span class="line"> try: </span><br><span class="line"> os.remove(src) </span><br><span class="line"> except: </span><br><span class="line"> pass </span><br><span class="line"> elif os.path.isdir(src): </span><br><span class="line"> for item in os.listdir(src): </span><br><span class="line"> itemsrc=os.path.join(src,item) </span><br><span class="line"> delete_file_folder(itemsrc) </span><br><span class="line"> try: </span><br><span class="line"> os.rmdir(src) </span><br><span class="line"> except: </span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"># 创建一个空文件,此文件作为apk包中的空文件</span><br><span class="line">src_empty_file = 'info/empty.txt'</span><br><span class="line">f = open(src_empty_file,'w')</span><br><span class="line">f.close()</span><br><span class="line"></span><br><span class="line"># 在渠道号配置文件中,获取指定的渠道号</span><br><span class="line">channelFile = open('./info/channel.txt','r')</span><br><span class="line">channels = channelFile.readlines()</span><br><span class="line">channelFile.close()</span><br><span class="line">print('-'*20,'all channels','-'*20)</span><br><span class="line">print(channels)</span><br><span class="line">print('-'*50)</span><br><span class="line"></span><br><span class="line"># 获取当前目录下所有的apk文件</span><br><span class="line">src_apks = [];</span><br><span class="line">for file in os.listdir('.'):</span><br><span class="line"> if os.path.isfile(file):</span><br><span class="line"> extension = os.path.splitext(file)[1][1:]</span><br><span class="line"> if extension in 'apk':</span><br><span class="line"> src_apks.append(file)</span><br><span class="line"></span><br><span class="line"># 遍历所以的apk文件,向其压缩文件中添加渠道号文件</span><br><span class="line">for src_apk in src_apks:</span><br><span class="line"> src_apk_file_name = os.path.basename(src_apk)</span><br><span class="line"> print('current apk name:',src_apk_file_name)</span><br><span class="line"> temp_list = os.path.splitext(src_apk_file_name)</span><br><span class="line"> src_apk_name = temp_list[0]</span><br><span class="line"> src_apk_extension = temp_list[1]</span><br><span class="line"></span><br><span class="line"> apk_names = src_apk_name.split('-');</span><br><span class="line"></span><br><span class="line"> output_dir = 'outputDir'+'/'</span><br><span class="line"> if os.path.exists(output_dir):</span><br><span class="line"> delete_file_folder(output_dir)</span><br><span class="line"> if not os.path.exists(output_dir):</span><br><span class="line"> os.mkdir(output_dir)</span><br><span class="line"></span><br><span class="line"> # 遍历从文件中获得的所以渠道号,将其写入APK包中</span><br><span class="line"> for line in channels:</span><br><span class="line"> target_channel = line.strip()</span><br><span class="line"> target_apk = output_dir + apk_names[0] + "-" + target_channel+"-"+apk_names[2] + src_apk_extension</span><br><span class="line"> shutil.copy(src_apk, target_apk)</span><br><span class="line"> zipped = zipfile.ZipFile(target_apk, 'a', zipfile.ZIP_DEFLATED)</span><br><span class="line"> empty_channel_file = "META-INF/uuchannel_{channel}".format(channel = target_channel)</span><br><span class="line"> zipped.write(src_empty_file, empty_channel_file)</span><br><span class="line"> zipped.close()</span><br><span class="line"></span><br><span class="line">print('-'*50)</span><br><span class="line">print('repackaging is over ,total package: ',len(channels))</span><br><span class="line">input('\npackage over...')</span><br></pre></td></tr></table></figure></p>
<p><strong>4>打包一个正常的apk包</strong> </p>
<p> 使用AndroidStudio 打一个签名的apk文件、要往这个apk写入渠道号、我们可以动态获取写入的渠道,在设置到友盟或者Bugly</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">// 友盟</span><br><span class="line"> private void initUMSDK() {</span><br><span class="line"> String channel = AppChannelUtil.getChannel(this);</span><br><span class="line"> UMConfigure.init(this, "APP_ID", channel, UMConfigure.DEVICE_TYPE_PHONE, null);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">// Bugly</span><br><span class="line"> private void initBugly() {</span><br><span class="line"> CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(this);</span><br><span class="line"> String channel = AppChannelUtil.getChannel(this);</span><br><span class="line"> strategy.setAppChannel(channel);</span><br><span class="line"> String version = ApkUtil.getCurrentVersionName(this);</span><br><span class="line"> strategy.setAppVersion(version);</span><br><span class="line"> String packageName = ApkUtil.getPackageName(this);</span><br><span class="line"> strategy.setAppPackageName(packageName);</span><br><span class="line"> Bugly.init(this, "APP_ID", false, strategy);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<p> <strong>5>android代码中获取渠道号</strong></p>
<p> 渠道号工具类:解析压缩包,从中获取渠道号设置统计渠道的软件:友盟,Bugly<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"> public class ChannelUtil {</span><br><span class="line"> private static final String CHANNEL_KEY = "uuchannel";</span><br><span class="line"> private static final String DEFAULT_CHANNEL = "internal";</span><br><span class="line"> private static String mChannel;</span><br><span class="line"></span><br><span class="line"> public static String getChannel(Context context) {</span><br><span class="line"> return getChannel(context, DEFAULT_CHANNEL);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public static String getChannel(Context context, String defaultChannel) {</span><br><span class="line"> if (!TextUtils.isEmpty(mChannel)) {</span><br><span class="line"> return mChannel;</span><br><span class="line"> }</span><br><span class="line"> //从apk中获取</span><br><span class="line"> mChannel = getChannelFromApk(context, CHANNEL_KEY);</span><br><span class="line"> if (!TextUtils.isEmpty(mChannel)) {</span><br><span class="line"> return mChannel;</span><br><span class="line"> }</span><br><span class="line"> //全部获取失败</span><br><span class="line"> return defaultChannel;</span><br><span class="line"> }</span><br><span class="line"> /**</span><br><span class="line"> * 从apk中获取版本信息</span><br><span class="line"> *</span><br><span class="line"> * @param context</span><br><span class="line"> * @param channelKey</span><br><span class="line"> * @return</span><br><span class="line"> */</span><br><span class="line"> private static String getChannelFromApk(Context context, String channelKey) {</span><br><span class="line"> long startTime = System.currentTimeMillis();</span><br><span class="line"> //从apk包中获取</span><br><span class="line"> ApplicationInfo appinfo = context.getApplicationInfo();</span><br><span class="line"> String sourceDir = appinfo.sourceDir;</span><br><span class="line"> //默认放在meta-inf/里, 所以需要再拼接一下</span><br><span class="line"> String key = "META-INF/" + channelKey;</span><br><span class="line"> String ret = "";</span><br><span class="line"> ZipFile zipfile = null;</span><br><span class="line"> try {</span><br><span class="line"> zipfile = new ZipFile(sourceDir);</span><br><span class="line"> Enumeration entries = zipfile.entries();</span><br><span class="line"> while (entries.hasMoreElements()) {</span><br><span class="line"> ZipEntry entry = ((ZipEntry) entries.nextElement());</span><br><span class="line"> String entryName = entry.getName();</span><br><span class="line"> if (entryName.startsWith(key)) {</span><br><span class="line"> ret = entryName;</span><br><span class="line"> break;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> } catch (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } finally {</span><br><span class="line"> if (zipfile != null) {</span><br><span class="line"> try {</span><br><span class="line"> zipfile.close();</span><br><span class="line"> } catch (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> String channel = "";</span><br><span class="line"> if (!TextUtils.isEmpty(ret)) {</span><br><span class="line"> String[] split = ret.split("_");</span><br><span class="line"> if (split != null && split.length >= 2) {</span><br><span class="line"> channel = ret.substring(split[0].length() + 1);</span><br><span class="line"> }</span><br><span class="line"> System.out.println("-----------------------------");</span><br><span class="line"> System.out.println("渠道号:" + channel + ",解压获取渠道号耗时:" + (System.currentTimeMillis() - startTime) + "ms");</span><br><span class="line"> System.out.println("-----------------------------");</span><br><span class="line"> } else {</span><br><span class="line"> System.out.println("未解析到相应的渠道号,使用默认内部渠道号");</span><br><span class="line"> channel = DEFAULT_CHANNEL;</span><br><span class="line"> }</span><br><span class="line"> return channel;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>5>执行python脚本,多渠道打包</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">新建buildapk目录在此目录新建“info”目录,目录放channel.txt,empty.txt</span><br><span class="line"></span><br><span class="line">channel.txt:创建一个空文件,此文件作为apk包中的空文件</span><br><span class="line">empty.txt:在渠道号配置文件中,获取指定的渠道号</span><br><span class="line"></span><br><span class="line">buildapk 目录放入打一个签名的apk文件,和一个打包的python文件.</span><br></pre></td></tr></table></figure></p>
<p><strong>6>命令</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">安装python https://www.python.org/downloads</span><br><span class="line"></span><br><span class="line">查看版本 python3 --version</span><br><span class="line"></span><br><span class="line">进入buildapk目录 </span><br><span class="line">执行权限设置:chmod u+x apk.py</span><br><span class="line"></span><br><span class="line">执行打包:python apk.py</span><br><span class="line"></span><br><span class="line">渠道名字列表可以添加修改:channel.txt</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Nexus创建Repository]]></title>
<url>/2016/07/02/Nexus%E5%88%9B%E5%BB%BARepository/</url>
<content type="html"><![CDATA[<p><strong>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情,“时光不倒带,岁月不重来”-致自己 ​​​​</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">比如Android开发需要本地仓库和代理仓库-Jcenter/mavenCentral/google等,我们需要把以上本地仓库和代理仓库整合起来,</span><br><span class="line"></span><br><span class="line">用group来合并多个hosted/proxy仓库.</span><br></pre></td></tr></table></figure>
<blockquote>
<p><strong>创建hosted Respository</strong><br><img src="/2016/07/02/Nexus创建Repository/host_rep.png" alt=""></p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">Repository ID(仓库ID)/Repository Name(储存库名称) </span><br><span class="line"></span><br><span class="line"> 我们可以填写一样哦名字这样方便(注:鼠标可以放置最后的图标上查看获取具体信息).</span><br><span class="line"></span><br><span class="line">Repository Policy(储存库的策略) </span><br><span class="line"></span><br><span class="line"> Relaese时、表示此宿主仓库是发布版.</span><br><span class="line"></span><br><span class="line"> Snapshot时、表示此宿主仓库为快照版.</span><br><span class="line"></span><br><span class="line">Deployment Policy(部署策略)</span><br><span class="line"> </span><br><span class="line"> Allow Redeploy允许重新部署.</span><br><span class="line"></span><br><span class="line"> Disabled Redeploy 禁用重新部署也就是说同有构件智能部署一次.</span><br><span class="line"></span><br><span class="line"> Read only 禁止部署.</span><br><span class="line"></span><br><span class="line">Allow File Browsing 是否允许浏览仓库内容.</span><br><span class="line"></span><br><span class="line">Include in search 是否对该仓库进行索引并提供搜索.</span><br><span class="line"></span><br><span class="line">Publish URL 是否通过URL提供服务.</span><br></pre></td></tr></table></figure>
<p><img src="/2016/07/02/Nexus创建Repository/rel_snp.png" alt=""></p>
<p><strong>注:创建 Relaese/Snapshot 一样的操作只是选择Repository Policy类型不一样</strong></p>
<blockquote>
<p><strong>创建Proxy Respository</strong><br><img src="/2016/07/02/Nexus创建Repository/pro_rep.png" alt=""></p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">Repository ID(仓库ID)/Repository Name(储存库名称) 和Hosted一样最好填写一样.</span><br><span class="line"></span><br><span class="line">Remote Storage Location 配置应远程的仓库地址.</span><br><span class="line"></span><br><span class="line">Download Remote Indexes 是否下载远程仓库的索引,有些远程仓库拥有索引,下载其索引后</span><br><span class="line"> 即使没有缓存远程仓库的构件,用户还能在本地浏览搜索构件信息.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">已下是远程仓库地址:</span><br><span class="line"> google():https://dl.google.com/dl/android/maven2/</span><br><span class="line"></span><br><span class="line"> mavenCentral():https://repo1.maven.org/maven2/ </span><br><span class="line"></span><br><span class="line"> jcenter():http://jcenter.bintray.com/ </span><br><span class="line"></span><br><span class="line"> jitpack:https://jitpack.io/</span><br><span class="line"></span><br><span class="line"> aliyun():http://maven.aliyun.com/nexus/content/groups/public/</span><br></pre></td></tr></table></figure>
<p><strong>下面列出的就是以上远程仓库地址 可能有的远程地址不能用,最好添加时Google下</strong><br><img src="/2016/07/02/Nexus创建Repository/mo_rsp.png" alt=""></p>
<blockquote>
<p><strong>创建Nexus group</strong></p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Nexus仓库组是整合hosted/proxy等,而Maven是根据groupId,artifactId,version等信息向你要构件方便Maven的配置,</span><br><span class="line"></span><br><span class="line">Nexus能够将多个仓库hosted/proxy合并成一个group,这样Maven只需要依赖于一个group,便能使用该group组内所有仓库内容.</span><br></pre></td></tr></table></figure>
<p><img src="/2016/07/02/Nexus创建Repository/gro.png" alt=""></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">项目build.gradle文件repositories中配置地址 maven { url 'http://localhost:8081/nexus/content/groups/android_public/' }</span><br></pre></td></tr></table></figure>
<p><img src="/2016/07/02/Nexus创建Repository/and_pub.png" alt=""></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">编译完毕,查看上图Nexus服务器上android_public的【BrowseStorage】编译所需要的资源,已经下载到了我们的Proxy代理服务器上</span><br><span class="line"></span><br><span class="line">以后再使用相同的资源都是从配置好的Proxy服务器上下载,速度很快,由于项目小、秒秒通过</span><br></pre></td></tr></table></figure>
<p><a href="https://github.com/SummerTimes/MemberMobile.git" target="_blank" rel="noopener">MemberMobile测试代码</a><br><img src="/2016/07/02/Nexus创建Repository/save.png" alt=""></p>
<blockquote>
<p><strong>手动上传第三方的jar</strong></p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">我们把本地的jar 上传击3rd party仓库,在仓库详情的tab中,选择Artifact Upload一栏</span><br><span class="line"></span><br><span class="line"> GAV Definition: 选择AGV Parameters来定义资源</span><br><span class="line"></span><br><span class="line"> 比如:compile 'com.squareup.retrofit2:retrofit:2.1.0' </span><br><span class="line"></span><br><span class="line"> Group: "com.squareup.retrofit2"就是组,我们在依赖的时候会用到它</span><br><span class="line"> </span><br><span class="line"> Artifact: Artifact和第二处的Group一样,两个冒号中间的"retrofit"就是Artifact,用它来定义库的名称</span><br><span class="line"></span><br><span class="line"> Version: "2.1.0" 版本号</span><br><span class="line"></span><br><span class="line"> Packaging: 包的类型,依赖的库的类型</span><br></pre></td></tr></table></figure>
<p><img src="/2016/07/02/Nexus创建Repository/3rd.png" alt=""><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">把这个库添加到待上传区域,这个地方可以多次选择添加文件,add Artifact 可以上传多个jar包</span><br><span class="line"></span><br><span class="line">Upload Artifact: 进行上传到仓库</span><br></pre></td></tr></table></figure></p>
<p><img src="/2016/07/02/Nexus创建Repository/uplod_jar.png" alt=""></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">查看3rd party仓库列表,上传的库就在当前目录下、可以刷新下</span><br></pre></td></tr></table></figure>
<p><img src="/2016/07/02/Nexus创建Repository/uplod_ww.png" alt=""></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">由于上面的测试项目已经添加了组、组内已经添加了3rd party</span><br><span class="line">maven { url 'http://localhost:8081/nexus/content/groups/android_public/' }</span><br><span class="line"></span><br><span class="line">项目添加依赖 implementation "com.kk.app:ww:1.0.1" 此库已经依赖到项目中、</span><br></pre></td></tr></table></figure>
<p><img src="/2016/07/02/Nexus创建Repository/and_3rd.png" alt=""><br><img src="/2016/07/02/Nexus创建Repository/mobile.png" alt=""></p>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[搭建Nexus/maven]]></title>
<url>/2016/07/01/Nexus-maven/</url>
<content type="html"><![CDATA[<p><strong>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情,“时光不倒带,岁月不重来”-致自己 ​​​​</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">中台开发(java)的童鞋对Maven一定不陌生;android开发的童鞋经常使用gradle 其实Gradle的第三方的库也是依赖google() mavenCentral() jcenter() </span><br><span class="line"></span><br><span class="line">对于第三方的库都是从以上配置远程依赖.这样方便管理依赖,对于公司的App 团队开发十来个人,工程越来越大/随着业务的扩展代码量大大的增加,功能模块越来越</span><br><span class="line"></span><br><span class="line">耦合的严重,Win电脑构建项目十来分钟、有种想哭的感觉、每天都是在构建,通过组件化拆分各个的组件、网络/工具类组件等、业务模块可以单独构建,搭建Nexus</span><br><span class="line"></span><br><span class="line">依赖管理必不可少、单个组件编译上传Maven 通过gradle引用依赖.解决以上问题.</span><br></pre></td></tr></table></figure>
<blockquote>
<p><a href="https://blog.sonatype.com/2010/04/why-nexus-for-the-non-programmer/" target="_blank" rel="noopener">”什么是Nexus?“</a><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Nexus管理开发所需的软件“工件”.如果您开发软件,则您的内部版本可以从Nexus下载依赖项,并且可以将工件发布到Nexus,从而创建一种在组织内共享工件的新方法.尽管Central仓库一直为</span><br><span class="line"></span><br><span class="line">开发人员提供了极大的便利,但是您不应该直接使用它.您应该使用Nexus代理Central并维护自己的存储库,以确保组织内的稳定性.使用Nexus,您可以从一个位置完全控制对组织中每个工件的</span><br><span class="line"></span><br><span class="line">访问和部署.</span><br></pre></td></tr></table></figure></p>
</blockquote>
<blockquote>
<p><a href="http://maven.apache.org/what-is-maven.html" target="_blank" rel="noopener">”什么是Maven?“</a><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Maven通过检索构建应用程序所需的工件并将构建过程的结果部署到存储库中来利用存储库的概念.Maven使用结构化存储库的概念,因此可以检索组件以支持构建.这些组件或依赖项包括库,框架</span><br><span class="line"></span><br><span class="line">容器等,Maven可以识别存储库中的组件,了解它们的依赖关系,检索成功构建所需的所有组件,并在构建完成后将其输出部署回存储库.</span><br></pre></td></tr></table></figure></p>
</blockquote>
<blockquote>
<p><strong><a href="https://www.sonatype.com/" target="_blank" rel="noopener">Nexus</a>/<a href="http://maven.apache.org/" target="_blank" rel="noopener">Maven</a>区别</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Sonatype Nexus/Apache Maven是经常一起工作的两个软件,但是它们执行的工作却截然不同.</span><br><span class="line"></span><br><span class="line">Nexus提供了一个存储库,而Maven使用一个存储库来构建软件.</span><br></pre></td></tr></table></figure></p>
</blockquote>
<p><strong>1><a href="https://help.sonatype.com/repomanager2/installing-and-running/downloading" target="_blank" rel="noopener">下载/安装Nexus</a></strong></p>
<p>由于自己使用的是mac安装过Homebrew没安装过的可以后续玩玩、<a href="https://brew.sh/index_zh-cn.html" target="_blank" rel="noopener">Homebrew</a>地址</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">通过以下命令安装 Nexus</span><br><span class="line"></span><br><span class="line">brew install nexus</span><br><span class="line"></span><br><span class="line">启动Nexus </span><br><span class="line"></span><br><span class="line">brew services start nexus</span><br></pre></td></tr></table></figure>
<p>过浏览器打开地址,<a href="http://127.0.0.1:8081/nexus/" target="_blank" rel="noopener">http://127.0.0.1:8081/nexus/</a> 默认的网页界面,是不是很容易呢!<br>通过右上角 Log in 默认账号admin,密码admin123<br><img src="/2016/07/01/Nexus-maven/nex.png" alt=""></p>
<p>通过admin 登陆以后会出现以下界面 由于我安装的版本比较低、找到左侧对应的用户我们先创建用户<br><img src="/2016/07/01/Nexus-maven/nexlogin.png" alt=""></p>
<p>浏览器装了google翻译,已翻译为中文了一目了然,点击最上方创建用户 下面的信心填写完整可以点击下面的角色来分配当前用户的权限<br><img src="/2016/07/01/Nexus-maven/creuser.png" alt=""></p>
<p>选择你需要的权限增加保存上面列表就会出现你当前的用户信息<br><img src="/2016/07/01/Nexus-maven/usepre.png" alt=""></p>
<p>创建maven仓库,通过创建的用户登录 创建仓库</p>
<p><img src="/2016/07/01/Nexus-maven/depot.png" alt=""></p>
<p><strong> 创建repository方式 </strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">hosted:本地仓库 注:通常我们会部署自己的构件到这一类型的仓库.</span><br><span class="line"></span><br><span class="line">proxy:代理仓库 注:它们被用来代理远程的公共仓库,如maven中央仓库.</span><br><span class="line"></span><br><span class="line">virtual:虚拟仓库</span><br><span class="line"></span><br><span class="line">group:储存仓库组 注:用来合并多个hosted/proxy仓库,只需要引用一个group即可.</span><br></pre></td></tr></table></figure></p>
<p><strong>Nexus自带仓库</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">3rd Party是一个第三方库,可以添加自己的第三方库;Maven central是Maven的中央仓库;central是一个代理仓库;</span><br><span class="line"></span><br><span class="line">Releases是用来存放自己项目中发布的构建,通常是Release版本的;Snapshots是发布那些非release版本,非稳定版本; </span><br><span class="line"></span><br><span class="line">等其他的库...</span><br></pre></td></tr></table></figure></p>
<p><img src="/2016/07/01/Nexus-maven/rep_loc.png" alt=""></p>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Mac 常用命令]]></title>
<url>/2015/04/13/Mac%20%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情.“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="查询项目无用资源"><a href="#查询项目无用资源" class="headerlink" title="查询项目无用资源"></a>查询项目无用资源</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">Android Studio 点击最上方的菜单栏“Analyze” -> Run Inspection by Name </span><br><span class="line"></span><br><span class="line">点击 Run Inspection by Name会弹出一个对话框。在对话框里面输入unused resource </span><br><span class="line"></span><br><span class="line">点击 unused resource 会弹出一个对话框,在对话框里面我们可以选择lint扫描整个项目,也可以扫描指定目录。</span><br><span class="line"></span><br><span class="line">之后 Studio会自动分析,然后可以根据结果清除无用的资源文件。</span><br></pre></td></tr></table></figure>
<h3 id="乱码问题解决"><a href="#乱码问题解决" class="headerlink" title="乱码问题解决"></a>乱码问题解决</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">linux/unix默认文件存储格式为UTF8,而windows中文版默认存储格式为GBK,utf8打开查看windows下的中文文件就会出现乱码</span><br><span class="line"></span><br><span class="line">使用iconv命令进行编码转换,将gbk格式转换为utf8格式再存储或者直接查看</span><br><span class="line"></span><br><span class="line">iconv -f gbk -t utf8 xxxxxx(文件名)</span><br><span class="line"></span><br><span class="line">使用iconv 进行编码转换 -f 表示输入格式 -t 表示输出格式 </span><br><span class="line"></span><br><span class="line">输出现在会直接输出到终端,可以使用 > 进行重定向输出到文件 </span><br><span class="line"></span><br><span class="line">如:iconv -f gbk -t utf8 test.txt > test.txt.utf8</span><br><span class="line"></span><br><span class="line">可以将一个名为test.txt的文件转换后输出到test.txt.utf8,这样在linux或mac上查看就可以正常查看中文了</span><br></pre></td></tr></table></figure>
<h3 id="git-命令"><a href="#git-命令" class="headerlink" title="git 命令"></a>git 命令</h3><p><strong> 在Downloads创建文件夹</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir git_code</span><br></pre></td></tr></table></figure></p>
<p><strong> 进入文件夹</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd git_code/</span><br></pre></td></tr></table></figure></p>
<p><strong> 克隆项目</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone “公司项目地址”</span><br></pre></td></tr></table></figure></p>
<!-- git clone [email protected]:ibl-Android/iBailianAndroid.git -->
<p><strong> 进入项目</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd 项目名/</span><br></pre></td></tr></table></figure></p>
<!-- cd iBailianAndroid/ -->
<p><strong> 查看项目</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls</span><br></pre></td></tr></table></figure></p>
<p><strong> 查看分支</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">当前分支:git branch </span><br><span class="line"></span><br><span class="line">所有分支:git branch -a</span><br></pre></td></tr></table></figure></p>
<p><strong> 刷新分支</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git fetch -p origin</span><br></pre></td></tr></table></figure></p>
<p><strong> 切分支</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git checkout origin dev</span><br><span class="line">注:第一次需要加上 -b: git checkout -b dev origin/dev</span><br></pre></td></tr></table></figure></p>
<p><strong> 切分支</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git checkout dev</span><br><span class="line"></span><br><span class="line">注:第一次需要加上 -b:</span><br><span class="line">git checkout -b dev origin/dev</span><br></pre></td></tr></table></figure></p>
<p><strong> 拉取分支</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git pull origin dev</span><br></pre></td></tr></table></figure></p>
<p><strong> 分支合并</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">注:将dev-分支信息 合并到当前分支</span><br><span class="line"></span><br><span class="line">git merge --no-ff dev</span><br></pre></td></tr></table></figure></p>
<p><strong> 分支合并</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">注:将当前pre分支信息提交到服务器</span><br><span class="line"></span><br><span class="line">git push origin pre</span><br></pre></td></tr></table></figure></p>
<h3 id="shell-命令"><a href="#shell-命令" class="headerlink" title="shell 命令"></a>shell 命令</h3><p><strong>ls</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls 列出所有目录</span><br></pre></td></tr></table></figure></p>
<p><strong>ls</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ls -l "文件名" 列出所有文件名相同的文件</span><br></pre></td></tr></table></figure></p>
<p><strong>Tab</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">"文件名" 列出所有文件名相同的文件</span><br></pre></td></tr></table></figure></p>
<p><strong>history</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">history 列出所有文件历史命令</span><br></pre></td></tr></table></figure></p>
<p><strong>history -c</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">history -c 清空所有历史命令</span><br></pre></td></tr></table></figure></p>
<p><strong>clear</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">clear 清空屏幕</span><br></pre></td></tr></table></figure></p>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Mac 配置Adb环境]]></title>
<url>/2015/04/12/Mac%20%E9%85%8D%E7%BD%AEAdb%E7%8E%AF%E5%A2%83/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情.“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h4 id="打开terminal-app-终端命令"><a href="#打开terminal-app-终端命令" class="headerlink" title="打开terminal.app 终端命令"></a>打开terminal.app 终端命令</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">你打开终端,默认显示的是home目录,也就是家目录.</span><br><span class="line"></span><br><span class="line">输入pwd命令可以查看当前所处目录的路径。</span><br><span class="line"></span><br><span class="line">输入cd ../命令可以到达上一级目录。</span><br><span class="line"></span><br><span class="line">输入ls命令可以查看当前目录下的所有子目录。</span><br></pre></td></tr></table></figure>
<h4 id="创建文件"><a href="#创建文件" class="headerlink" title="创建文件"></a>创建文件</h4><p>命令:<strong>touch</strong> “文件名”<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">touch .bash_profile</span><br></pre></td></tr></table></figure></p>
<h4 id="打开文件"><a href="#打开文件" class="headerlink" title="打开文件"></a>打开文件</h4><p><strong>open -e </strong> “.文件名”</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">open -e .bash_profile</span><br></pre></td></tr></table></figure>
<h4 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">在安装完成之后,将android的adb工具所在目录加入环境变量里面去</span><br><span class="line"></span><br><span class="line">在终端中输入 sudo vim ~/.bash_profile ,打开 .bash_profile文件</span><br><span class="line"></span><br><span class="line">按 i 进入输入模式,在文件内容的末尾加入以下内容:</span><br><span class="line"></span><br><span class="line">#Setting PATH for Android ADB Tools</span><br><span class="line"></span><br><span class="line">export PATH=${PATH}:/Users/xxx/Library/Android/sdk/platform-tools</span><br><span class="line">export PATH=${PATH}:/Users/xxx/Library/Android/sdk/tools</span><br><span class="line"></span><br><span class="line">这里面的xxx根据自己实际的用户名称进行修改</span><br><span class="line"></span><br><span class="line">然后点击 esc ,输入 :wq 回车(保存并退出文本)。</span><br><span class="line"></span><br><span class="line">添加完成后输入: source ~/.bash_profile 应用该变更。</span><br></pre></td></tr></table></figure>
<h4 id="abd的相关命令:"><a href="#abd的相关命令:" class="headerlink" title="abd的相关命令:"></a>abd的相关命令:</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">安装软件</span><br><span class="line">adb install apk文件名称.apk</span><br><span class="line"></span><br><span class="line">重新安装该软件</span><br><span class="line">adb install -r apk文件名称.apk</span><br><span class="line"></span><br><span class="line">卸载apk软件</span><br><span class="line">adb uninstall apk包名.apk</span><br><span class="line"></span><br><span class="line">查看手机上的运行日志,此项可以用来查错</span><br><span class="line">adb logcat</span><br><span class="line"></span><br><span class="line">查看手机是否连接,以及连接了几台手机</span><br><span class="line">adb devices</span><br><span class="line"></span><br><span class="line">A为手机路径,B为电脑路径,意思为:把文件从手机中复制到电脑上</span><br><span class="line">adb pull A B</span><br><span class="line">A为手机路径,B为电脑路径,意思为:把文件从电脑复制到手机上</span><br><span class="line">adb push B A</span><br></pre></td></tr></table></figure>
<p><strong>输入: adb version</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">yangdongdeMacBook-Pr:~ xxx$ adb devices</span><br><span class="line"></span><br><span class="line">List of devices attached</span><br><span class="line"></span><br><span class="line">APU0216125001297 device</span><br></pre></td></tr></table></figure>
<p><strong>连不上手机时先查看端口是否能被绑定,使用cmd命令</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb nodaemon server</span><br></pre></td></tr></table></figure>
<p><strong>提示:</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cannot bind 'tcp:5037'</span><br></pre></td></tr></table></figure>
<p><strong> 端口绑定失败,则继续查看到底是哪个端口给占用了 </strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">运行命令:netstat -ano | findstr "5037"</span><br></pre></td></tr></table></figure>
<p><strong> 案列,端口占用 </strong> </p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">C:\Users\YD30>adb nodaemon server</span><br><span class="line">error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)</span><br><span class="line"></span><br><span class="line">This application has requested the Runtime to terminate it in an unusual way.</span><br><span class="line">Please contact the application's support team for more information.</span><br><span class="line"></span><br><span class="line">C:\Users\YD30>netstat -ano | findstr "5037"</span><br><span class="line"> TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 5892</span><br><span class="line"> TCP 127.0.0.1:5037 127.0.0.1:51641 ESTABLISHED 5892</span><br><span class="line"> TCP 127.0.0.1:50925 127.0.0.1:5037 TIME_WAIT 0</span><br><span class="line"> TCP 127.0.0.1:51634 127.0.0.1:5037 TIME_WAIT 0</span><br><span class="line"> TCP 127.0.0.1:51635 127.0.0.1:5037 TIME_WAIT 0</span><br><span class="line"> TCP 127.0.0.1:51636 127.0.0.1:5037 TIME_WAIT 0</span><br><span class="line"> TCP 127.0.0.1:51637 127.0.0.1:5037 TIME_WAIT 0</span><br><span class="line"> TCP 127.0.0.1:51641 127.0.0.1:5037 ESTABLISHED 5968</span><br><span class="line"> TCP 127.0.0.1:51790 127.0.0.1:5037 TIME_WAIT 0</span><br><span class="line"> TCP 127.0.0.1:51801 127.0.0.1:5037 TIME_WAIT 0</span><br><span class="line"> TCP 127.0.0.1:51802 127.0.0.1:5037 TIME_WAIT 0</span><br><span class="line"> TCP 127.0.0.1:51803 127.0.0.1:5037 TIME_WAIT 0</span><br></pre></td></tr></table></figure>
<blockquote>
<p>说明当前端口被pid为8744的进程占用</p>
<ul>
<li>运行tasklist 查看列表pid为8744的进程</li>
<li>直接运行taskkill /pid 8744 </li>
<li>taskkill /im xxxx.exe</li>
</ul>
</blockquote>
<p> <strong>某些流氓软件进程可能关不掉,可以直接卸载</strong></p>
<p> <strong> adb kill-server 然后输入 adb start-server</strong></p>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[Mac Android Studio工具]]></title>
<url>/2015/04/10/Mac%20Android%20Studio%E5%B7%A5%E5%85%B7/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情.“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<p>注:<a href="http://www.developerphil.com/android-studio-tips-of-the-day-roundup-1/" target="_blank" rel="noopener">AndroidStudio 快捷键提示</a></p>
<h3 id="Mac下快捷键的符号所对应的按键、"><a href="#Mac下快捷键的符号所对应的按键、" class="headerlink" title="Mac下快捷键的符号所对应的按键、"></a>Mac下快捷键的符号所对应的按键、</h3><p><strong>⌥ </strong>—> option|alt</p>
<p><strong>⇧ </strong>—>shift</p>
<p><strong>⌃ </strong>—>control</p>
<p><strong>⌘ </strong>—>command</p>
<p><strong>⎋ </strong>—>esc</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">注: 与F6/F7/F12等F功能键开头的组合的快捷键需要按住fn开启功能键</span><br><span class="line"></span><br><span class="line">如:快捷键⌘F12的按键组合为:fn + command + F12</span><br></pre></td></tr></table></figure>
<h3 id="Android-Studio-常用快捷键-for-mac"><a href="#Android-Studio-常用快捷键-for-mac" class="headerlink" title="Android Studio 常用快捷键 for mac"></a>Android Studio 常用快捷键 for mac</h3><ul>
<li><p><strong>⌘O</strong>: 全局查找class类名<使用率非常高></p>
</li>
<li><p><strong>⌘F</strong>: 在当前编辑文件中查找<使用率非常高> | 对应window中的Ctrl + F</p>
</li>
<li><p><strong>⌘F12</strong>:当前编辑的文件中结构快速导航 | 对应window中的 Ctrl + F12</p>
</li>
<li><p><strong>⌘E</strong>: 打开最近访问的文件列表 | 对应window中的Ctrl + E</p>
</li>
<li><p><strong>⌥⌘O</strong>: 输入类名/方法名/字段名来查找任何匹配的类/方法/字段<使用率非常高></p>
</li>
<li><p><strong>⇧⌘O</strong>: 全局项目查找文件(类/资源文件/布局文件都通过该快捷键查找)<使用率非常高></p>
</li>
<li><p><strong>⌃H</strong>: 查看当前编辑class类的hierarchy结构 | 对应window中的Ctrl + H</p>
</li>
<li><p><strong>⌥F7</strong>: 列出全局项目中该类/方法 被引用/调用的情况<使用率非常高>[比⌥⌘F7显示效果好] | 对应window中的Alt + F7</p>
</li>
<li><p><strong>⌥⌘F7</strong>: 列出全局项目中该类/方法 被引用/调用的情况 | 对应window中的Ctrl + Alt + F7</p>
</li>
<li><p><strong>⌃⌥H</strong>: 方法被调用结构[method’s Call Hierarchy]| 对应window中的ctrl + alt + h</p>
</li>
<li><p><strong>⌘P</strong>: 列出函数方法一系列的有效参数,如果光标是一个方法调用的括号之间 | 对应window中的Ctrl + P</p>
</li>
<li><p><strong>⇧⌘F7</strong>: 快速,高亮显示变量在当前文件中的引用情况,使用⌘G和⇧⌘G快捷键 可以前往跳到下一个/上一个高亮的变量,按⎋移除高亮显示 | 对应window中的Ctrl + Shift + F7</p>
</li>
<li><p><strong>F1</strong>: 查看类/方法的注释文档</p>
</li>
</ul>
<h3 id="控制操作相关"><a href="#控制操作相关" class="headerlink" title="控制操作相关"></a>控制操作相关</h3><ul>
<li><p><strong>⌘/</strong>: 注释与取消注释,注释效果 //… | 对应window中的Ctrl + /</p>
</li>
<li><p><strong>⌥⌘</strong>/: 注释与取消注释,注释效果 /<em>…</em>/ | 对应window中的Ctrl+Shift+/</p>
</li>
<li><p><strong>⇧⌥up/down</strong>: 移动行上下移动 | 对应window中的alt + shift + up/down</p>
</li>
<li><p><strong>⌘delete</strong>: 删除行 | 对应window中的ctrl + y</p>
</li>
<li><p><strong>⌘d</strong>: 复制行 | 对应window中的 ctrl + d</p>
</li>
<li><p><strong>⌘J</strong>: 快速生成模版代码块,如if,while,return等<使用频率非常高,高效率编写代码> | 对应window中的Ctrl + J</p>
</li>
<li><p><strong>⌘N</strong>: 快速生成getter/setter方法,构造方法,toString()方法等 <使用率非常高> | 对应window中的Alt + Insert</p>
</li>
<li><p><strong>⌥⌘T</strong>: Surround with快速调出if,for,try…catch,while等环绕代码 | 对应window中的ctrl + alt + t</p>
</li>
<li><p><strong>⌃O</strong>: 引入重写父类的方法[Override Methods]<使用率非常高></p>
</li>
<li><p><strong>⌃I</strong>: 引入实现接口或抽象类方法[Implement Methods]<使用率非常高></p>
</li>
<li><p><strong>⌃Space</strong>: 当申明一个变量时,根据变量类型提示给出建议的变量名称,等还有其他很多智能提示作用<使用率非常高></p>
</li>
<li><p><strong>⌥⌘L</strong>: 代码格式化 <使用率非常高> | 对应window中的Ctrl+Alt+L</p>
</li>
<li><p><strong>⌘⇧U</strong>: 切换选中内容的大小写 <使用率非常高> | 对应window中的Ctrl+Shift+U</p>
</li>
</ul>
<h3 id="代码重构相关"><a href="#代码重构相关" class="headerlink" title="代码重构相关"></a>代码重构相关</h3><ul>
<li><p><strong>⇧F6</strong>:代码重构时,类名/方法名/变量名 重命名操作 | 对应window中的Shift + F6</p>
</li>
<li><p><strong>⌘R</strong>: 代码重构时,可以用来批量重命名变量</p>
</li>
<li><p><strong>⌥⌘M</strong>: 方法重构,方法抽离 |对应window中的Ctrl+Alt+M</p>
</li>
<li><p><strong>⌥⌘P</strong>: 参数重构,将方法内变量抽离成方法参数 |对应window中的Ctrl+Alt+P</p>
</li>
<li><p><strong>⌥⌘V</strong>: 变量抽离,<使用率非常高> | 对应window中的Ctrl+Alt+V</p>
</li>
<li><p><strong>⌥⌘F</strong>: 字段抽离,将方法内的变量抽离成类字段申明,简单说就是把变量的申明从方法内重构抽离到方法外 | 对应window中的Ctrl+Alt+F</p>
</li>
</ul>
]]></content>
<categories>
<category> Android </category>
</categories>
<tags>
<tag> Android </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA线程(四)]]></title>
<url>/2014/01/13/java-%E5%A4%9A%E7%BA%BF%E7%A8%8B-4/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="传统线程同步通信技术"><a href="#传统线程同步通信技术" class="headerlink" title="传统线程同步通信技术"></a>传统线程同步通信技术</h3><p><strong>实例:</strong><br> 子线程循环10次、主线程循环100次,接着又回到子线程循环10次,接着再回到主线程循环100次,如此循环50次:<br><strong>例如代码:</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category> java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA线程(三)]]></title>
<url>/2014/01/12/java-%E5%A4%9A%E7%BA%BF%E7%A8%8B-3/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="多线程的理解和创建"><a href="#多线程的理解和创建" class="headerlink" title="多线程的理解和创建"></a>多线程的理解和创建</h3>]]></content>
<categories>
<category> java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA线程(二)]]></title>
<url>/2014/01/11/java-%E5%A4%9A%E7%BA%BF%E7%A8%8B-2/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="多线程的理解和创建"><a href="#多线程的理解和创建" class="headerlink" title="多线程的理解和创建"></a>多线程的理解和创建</h3>]]></content>
<categories>
<category> java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA线程(-)]]></title>
<url>/2014/01/10/java-%E5%A4%9A%E7%BA%BF%E7%A8%8B-1/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="多线程的理解和创建"><a href="#多线程的理解和创建" class="headerlink" title="多线程的理解和创建"></a>多线程的理解和创建</h3><p><strong>进程:</strong>是什么?<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"> 在多任务系统中,每个独立执行的程序称为进程。也就是“正在运行的程序”,我们使用的操作系统一般都是多任务的,</span><br><span class="line"> 既能执行多个任务的应用程序,比如:Windows Linux Unix 实际的情况是:操作系统负责对CPU等设备的资源进行分配和管理,</span><br><span class="line"> 虽然这些设备在某些时刻只能做一件事,但以非常小的时间间隔交替执行多个程序。就可以给人以同时执行多个程序的感觉。</span><br><span class="line">如果我们同时运行两个记事本程序的两个实例。这就是两个不同的进程。</span><br></pre></td></tr></table></figure></p>
<p>我们使用Windows时候在从C盘向D盘复制文件的同时,又可以从E盘向F盘复制文件,复制的效率大大提高、怎么理解这句话?因为CPU只有一个每个进程都有独立的代码和数据空间(进程上下文) 在两个复制文件间切换需要额外的开销,反而比先执行完从C盘向D盘的复制在启动从E盘向F盘复制的慢。</p>
<p><strong>线程:</strong>是什么?<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">一个进程中可以包含一个或者多个线程,一个线程就是一个程序内部的一条执行线索,在单线程中,</span><br><span class="line">程序的代码按照顺序依次往下执行,在这种情况下,当主函数调用了子函数,主函数必须等待子函数返回后才能继续往下执行,</span><br><span class="line">不能实现两段程序代码同时交替运行的效果,如果要程序中实现多线程的代码,同时交替运行,就需要产生多个线程,并指定每个线程上所要运行的程序代码段这就是多线程。</span><br></pre></td></tr></table></figure></p>
<p> 当程序自动启动时就会产生了一个线程,主函数Main 就是在这个线程中运行的,当不在产生新的线程时,程序就是单线程。<br> 创建多线程有两种方式:继承Thread 类和实现Runnable 接口。 </p>
<h3 id="用Thread创建线程"><a href="#用Thread创建线程" class="headerlink" title="用Thread创建线程"></a>用Thread创建线程</h3><p> java的线程是通过java.lang.Thread 类来控制的,一个Thread 类的对象代表一个线程,<br> 而且只能代表一个线程,通过Thread 类创建的线程可以获取、当前的线程对象的名字、<br> 可以实现控制线程暂停一段时间等功能。</p>
<p><strong>上述一</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">public class ThreadDemo1 {</span><br><span class="line"> public static void main(String[] args) {</span><br><span class="line"> new TestThread().run();</span><br><span class="line"> // 代码块一</span><br><span class="line"> while (true) {</span><br><span class="line"> System.out.println("main--thread----is----runing--");</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class TestThread {</span><br><span class="line"> public void run() {</span><br><span class="line"> // 代码块二</span><br><span class="line"> while (true) {</span><br><span class="line"> System.out.println(Thread.currentThread().getName() + "-----is----running----");</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p> 上面的代码代码屏幕上不停的打印 “main—-is—-running——“ 说明代码块一没有执行,因为代码块二优先于代码块一运行,并且代码块二无限的循环,代码块一没有机会运行。<br> </p>
<p><strong>上述二</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">public class ThreadDemo1 {</span><br><span class="line"> public static void main(String[] args) {</span><br><span class="line"> new TestThread().start();</span><br><span class="line"> while (true) {</span><br><span class="line"> System.out.println("main--thread----is----runing--");</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class TestThread extends Thread {</span><br><span class="line"> @Override</span><br><span class="line"> public void run() {</span><br><span class="line"> while (true) {</span><br><span class="line"> System.out.println(Thread.currentThread().getName() + "-----is----running----");</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>两个while 循环处交替运行。<br>注:上面的TestThread 继承 Thread 也就是具有Thread 的类的全部的特点,程序没有直接的调用Thread类的run 方法,而是调用了该类对象从Thread 类继承的start 方法。</p>
<p><strong>上述一:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ThreadDemo1.main() ---> TestThread.run()------->单线程</span><br></pre></td></tr></table></figure></p>
<p><strong>上述二:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ThreadDemo1.main() 既可以执行主函数-又可以执行-->TestThread.run()------->多线程</span><br></pre></td></tr></table></figure></p>
<p>注:可见在单线程中main函数必须等到TestThread.run函数返回后才继续往下执行,而在多线程main函数调用TestThread.start()方法,启动了TestThread run() 函数后<br>main 函数不等待TestThread.run函数返回就继续运行。TestThread.run函数在一边独自运行,不影响原来main函数的运行,这就好比将一个1G的cpu分成两个500M的cpu,<br>在一个cpu上运行main函数,而TestThread 在另一个cpu运行,他们在同一个显示器输出,所以我们看到两个while循环处的代码同时交替运行。</p>
<p><strong>总结:</strong> </p>
<ul>
<li><p>要将一段代码在一个新的线程上运行,该代码在一个类的run函数中并且run函数所在的类<br>是Thread 的子类。倒过来我们可以这么讲,要实现多线程,必须编写一个继承Thread类的子类,<br>子类要覆盖Thread类的run函数,在子类的run函数中,调用想在新线程上运行的程序代码。</p>
</li>
<li><p>启动一个新的线程不是直接调用Thread 子类对象的run 方法。而是调用Thread 子类对象的start方法,<br>Thread 类对象的start方法将产生一个新的线程,并在该线程上运行该Thread对象中的run方法,<br>根据面向对象的多态性,在该线程上实际运行的是Thread子类对象的run方法。</p>
</li>
<li><p>由于线程的代码在run 方法中,那么该方法执行完以后,线程也就相应的结束了、<br>因而可以通过控制run方法中的循环条件来控制线程的</p>
</li>
</ul>
<h3 id="使用Runnable接口创建多线程"><a href="#使用Runnable接口创建多线程" class="headerlink" title="使用Runnable接口创建多线程"></a>使用Runnable接口创建多线程</h3><p>JDk 中可以看到 <strong>public Thread(Runnable target)</strong>可以创建一个线程, Runnable接口类中只有一个run 方法,<br>使用Thread(Runnable target) 创建线程对象时,需要为该方法传递一个实现runnable接口的类对象,<br>这样创建线程将调用那个实现了Runnable接口的类对象中的run()方法作为运行代码,而不再调用Thread类中的run方法了。</p>
<p><strong>上述三:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">public class ThreadDemo1 {</span><br><span class="line"> public static void main(String[] args) {</span><br><span class="line"> TestThread testThread = new TestThread();</span><br><span class="line"> Thread thread = new Thread(testThread);</span><br><span class="line"> thread.start();</span><br><span class="line"> </span><br><span class="line"> while (true) {</span><br><span class="line"> System.out.println("main--thread----is----runing--");</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class TestThread implements Runnable{</span><br><span class="line"> @Override</span><br><span class="line"> public void run() {</span><br><span class="line"> while (true) {</span><br><span class="line"> System.out.println(Thread.currentThread().getName() + "-----is----running----");</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<h3 id="两种实现多线程方式的对比分析"><a href="#两种实现多线程方式的对比分析" class="headerlink" title="两种实现多线程方式的对比分析"></a>两种实现多线程方式的对比分析</h3><p>要实现一个铁路售票的模拟程序,我们只创建一个资源对象,但要多个窗口(线程)处理同一个资源对象,<br>并且每个线程上所运行的是相同的程序代码,比如</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">public class ThreadDemo1 {</span><br><span class="line"> public static void main(String[] args) {</span><br><span class="line"> TestThread testThread = new TestThread();</span><br><span class="line"> new Thread(testThread).start();</span><br><span class="line"> new Thread(testThread).start();</span><br><span class="line"> new Thread(testThread).start();</span><br><span class="line"> new Thread(testThread).start();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class TestThread implements Runnable {</span><br><span class="line"> private int tickets = 100;</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public void run() {</span><br><span class="line"> while (true) {</span><br><span class="line"> if (tickets > 0) {</span><br><span class="line"> System.out.println(Thread.currentThread().getName() + "--" + tickets--);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>注: 可见实现Runnable 接口相对于继承Thread 类来说一下几点好处:</p>
<ul>
<li>适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效分离较好的体现了面向对象的思想。</li>
<li>可以避免由于java 的单继承特性带来的局限,比如:我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类<br>所以不能用继承Thread类的方式,那么这个类只有采用实现Runnable 接口的方式了。</li>
<li>有利于程序的健壮性,代码能够被多个程序共享,代码与数据是独立的,当多个线程的执行代码来自同一个类时,既称他们共享相同的代码,<br>多个线程可以操作相同的数据,与他们的代码无关,当共享访问相同对象时,既他们共享相同的数据。当线程被构造时,需要的代码和数据<br>通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable 接口的类的实例。</li>
</ul>
]]></content>
<categories>
<category> java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA-简单排序]]></title>
<url>/2014/01/02/JAVA-%E7%AE%80%E5%8D%95%E6%8E%92%E5%BA%8F/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="JAVA-中几种简单的排序方式"><a href="#JAVA-中几种简单的排序方式" class="headerlink" title="JAVA 中几种简单的排序方式"></a>JAVA 中几种简单的排序方式</h3><p><strong>例如代码:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">public static void main(String[] args) {</span><br><span class="line"> int data[] = {1, 2, 6, 4, 5, 8, 75, 3, 9,};</span><br><span class="line"> print(insertSort(data));</span><br><span class="line"> }</span><br></pre></td></tr></table></figure></p>
<p><strong>打印数据:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">private static void print(int[] list) {</span><br><span class="line"> for (int i = 0; i < list.length; i++) {</span><br><span class="line"> System.out.println("元素值:" + list[i]);</span><br><span class="line"> }</span><br><span class="line"> System.out.println("元素值:over");</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>选排序算法/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">private static int[] selectSort(int[] data) {</span><br><span class="line"> for (int i = 0; i < data.length - 1; i++) {</span><br><span class="line"> int min = i;</span><br><span class="line"> for (int j = i + 1; j < data.length; j++) {</span><br><span class="line"> if (data[min] > data[j]) {</span><br><span class="line"> min = j;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> if (min != i) {</span><br><span class="line"> int temp = data[i];</span><br><span class="line"> data[i] = data[min];</span><br><span class="line"> data[min] = temp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> return data;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>冒泡/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">private static int[] bubbleSort(int[] data) {</span><br><span class="line"> for (int i = 0; i < data.length - 1; i++) {</span><br><span class="line"> for (int j = i + 1; j < data.length; j++) {</span><br><span class="line"> if (data[i] > data[j]) {</span><br><span class="line"> int temp = data[i];</span><br><span class="line"> data[i] = data[j];</span><br><span class="line"> data[j] = temp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> return data;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>插入排序/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">private static int[] insertSort(int[] data) {</span><br><span class="line"> for (int i = 0; i < data.length; i++) {</span><br><span class="line"> for (int j = i; j > 0; j--) {</span><br><span class="line"> if (data[j] < data[j - 1]) {</span><br><span class="line"> int temp = data[j - 1];</span><br><span class="line"> data[j - 1] = data[j];</span><br><span class="line"> data[j] = temp;</span><br><span class="line"> } else {</span><br><span class="line"> break;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> return data;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>Arrays/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">private static int[] arraysSort(int[] data) {</span><br><span class="line"> Arrays.sort(data);</span><br><span class="line"> return data;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
]]></content>
<categories>
<category> java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA-ArrayList]]></title>
<url>/2014/01/01/JAVA-ArrayList/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="ArrayList-删除数据方式"><a href="#ArrayList-删除数据方式" class="headerlink" title="ArrayList 删除数据方式"></a>ArrayList 删除数据方式</h3><p><strong>例如代码:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">public static void main(String[] args) {</span><br><span class="line"> //集合中添加数据</span><br><span class="line"> ArrayList<String> list = new ArrayList<String>();</span><br><span class="line"> list.add("beijing");</span><br><span class="line"> list.add("shanghai");</span><br><span class="line"> list.add("shanghai");</span><br><span class="line"> list.add("guangzhou");</span><br><span class="line"> list.add("shenzhen");</span><br><span class="line"> list.add("hangzhou");</span><br><span class="line"> print(list);</span><br><span class="line"> remove11(list, "shanghai");</span><br><span class="line"> }</span><br></pre></td></tr></table></figure></p>
<p><strong>打印数据:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">private static void print(List<String> list){</span><br><span class="line"> for (String item : list) {</span><br><span class="line"> System.out.println("元素值:" + item);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>错误/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">public static void remove11(List<String> list, String target){</span><br><span class="line"> int size = list.size();</span><br><span class="line"> for(int i = 0; i < size; i++){</span><br><span class="line"> String item = list.get(i);</span><br><span class="line"> if(target.equals(item)){</span><br><span class="line"> list.remove(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> print(list);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>错误/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">public static void remove12(List<String> list, String target){</span><br><span class="line"> for(int i = 0; i < list.size(); i++){</span><br><span class="line"> String item = list.get(i);</span><br><span class="line"> if(target.equals(item)){</span><br><span class="line"> list.remove(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> print(list);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>正确/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">public static void remove13(List<String> list, String target){</span><br><span class="line"> int size = list.size();</span><br><span class="line"> for(int i = size - 1; i >= 0; i--){</span><br><span class="line"> String item = list.get(i);</span><br><span class="line"> if(target.equals(item)){</span><br><span class="line"> list.remove(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> print(list);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>正确删除方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">public static void remove14(List<String> list, String target){</span><br><span class="line"> for(int i = list.size() - 1; i >= 0; i--){</span><br><span class="line"> String item = list.get(i);</span><br><span class="line"> if(target.equals(item)){</span><br><span class="line"> list.remove(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> print(list);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>错误/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">public static void remove15(List<String> list, String target){</span><br><span class="line"> for(String item : list){</span><br><span class="line"> if(target.equals(item)){</span><br><span class="line"> list.remove(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> print(list);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>正确/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">public static void remove16(ArrayList<String> list, String target) {</span><br><span class="line"> final CopyOnWriteArrayList<String> cowList = new CopyOnWriteArrayList<String>(list);</span><br><span class="line"> for (String item : cowList) {</span><br><span class="line"> if (item.equals(target)) {</span><br><span class="line"> cowList.remove(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> print(cowList);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>错误/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">public static void remove17(List<String> list, String target){</span><br><span class="line"> Iterator<String> iter = list.iterator();</span><br><span class="line"> while (iter.hasNext()) {</span><br><span class="line"> String item = iter.next();</span><br><span class="line"> if (item.equals(target)) {</span><br><span class="line"> list.remove(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> print(list);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>正确/方式:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">public static void remove18(List<String> list, String target){</span><br><span class="line"> Iterator<String> iter = list.iterator();</span><br><span class="line"> while (iter.hasNext()) {</span><br><span class="line"> String item = iter.next();</span><br><span class="line"> if (item.equals(target)) {</span><br><span class="line"> iter.remove();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> print(list);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
]]></content>
<categories>
<category> java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA-gson]]></title>
<url>/2013/12/30/JAVA-gson/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="Gson-转换方式"><a href="#Gson-转换方式" class="headerlink" title="Gson/转换方式"></a>Gson/转换方式</h3><p><strong>实体bean代码:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"> public class UserBean {</span><br><span class="line"> @Expose</span><br><span class="line"> public String id;</span><br><span class="line"> @Expose</span><br><span class="line"> public String name;</span><br><span class="line"> public Date birthday;</span><br><span class="line"></span><br><span class="line"> @Override</span><br><span class="line"> public String toString() {</span><br><span class="line"> return "UserBean{" +</span><br><span class="line"> "id='" + id + '\'' +</span><br><span class="line"> ", name='" + name + '\'' +</span><br><span class="line"> ", birthday=" + birthday +</span><br><span class="line"> '}';</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p><strong>普通 字符串集合转化:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">List<UserBean> userBeans = new ArrayList<>();</span><br><span class="line">UserBean userBean = new UserBean();</span><br><span class="line">userBean.id="456";</span><br><span class="line">userBean.name="哈喽";</span><br><span class="line">userBeans.add(userBean);</span><br><span class="line"></span><br><span class="line">Gson gson = new Gson();</span><br><span class="line">Type type = new TypeToken<List<UserBean>>() {}.getType();</span><br><span class="line"></span><br><span class="line">String strOne = gson.toJson(userBeans, type);</span><br><span class="line">System.out.println("------转换字符串数据------:" + strOne);</span><br><span class="line"></span><br><span class="line">List<UserBean> userBeanList = gson.fromJson(strOne,type);</span><br><span class="line">System.out.println("------转换集合------:"+userBeanList.toString());</span><br></pre></td></tr></table></figure></p>
<p><strong>普通 字符串集合转化:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">注:@Expose用于允许和禁止serialization和deserialization.</span><br><span class="line"> @Expose是可选的,它具有两个配置参数:serialize和deserialize,默认情况下/它们设置为true.</span><br><span class="line"></span><br><span class="line">UserBean userBean = new UserBean();</span><br><span class="line">userBean.id = "123";</span><br><span class="line">userBean.name = "你好啊";</span><br><span class="line">userBean.birthday = new Date();</span><br><span class="line">System.out.println("---原始数据----" + userBean.toString());</span><br><span class="line"></span><br><span class="line">GsonBuilder gsonBuilder = new GsonBuilder();</span><br><span class="line">// 不转换没有 @Expose 注解的字段</span><br><span class="line">gsonBuilder.excludeFieldsWithoutExposeAnnotation();</span><br><span class="line">Gson gson = gsonBuilder.create();</span><br><span class="line"></span><br><span class="line">// 将JavaBean字符串转换为 JSON 
</span><br><span class="line">String str = gson.toJson(userBean);</span><br><span class="line">System.out.println("---转字符串----" + str);</span><br><span class="line"></span><br><span class="line">UserBean userBeanTwo = new Gson().fromJson(str, UserBean.class);</span><br><span class="line">System.out.println("----id---" + userBeanTwo.id + "----Name----" + userBeanTwo.name + "----birthday---" + userBeanTwo.birthday);</span><br></pre></td></tr></table></figure></p>
]]></content>
<categories>
<category> java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA笔记(十二)]]></title>
<url>/2013/09/30/JAVA-12/</url>
<content type="html"><![CDATA[<p>时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情。<br>“时光不倒带,岁月不重来”-致自己 ​​​​</p>
<h3 id="线程间通信"><a href="#线程间通信" class="headerlink" title="线程间通信"></a>线程间通信</h3><p>线程间通讯:其实就是多个线程在操作同一个资源,但是操作的动作不同。</p>
<p>例如:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">1:是不是多线程两个或者两个以上。</span><br><span class="line">2:是不是同一把锁。synchronized(r)</span><br></pre></td></tr></table></figure></p>
<p><strong>等待唤醒机制</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">线程运行的时候内存中会建立一个运行的内存池,等待线程都存在线程池当中,</span><br><span class="line">notify唤醒的是线程池中第一个等待的线程</span><br><span class="line"></span><br><span class="line">class Res</span><br><span class="line">{</span><br><span class="line"> private String name;</span><br><span class="line"> private String sex;</span><br><span class="line"> // 加入一个标志:false 存、true 取</span><br><span class="line"> private boolean flag = false;</span><br><span class="line"></span><br><span class="line"> public synchronized void set(String name,String sex)</span><br><span class="line"> {</span><br><span class="line"> if(flag)</span><br><span class="line"> try{this.wait();}catch(Exception e){}</span><br><span class="line"> this.name = name;</span><br><span class="line"> </span><br><span class="line"> this.sex = sex;</span><br><span class="line"> flag = true;</span><br><span class="line"> this.notify();</span><br><span class="line"> }</span><br><span class="line"> public synchronized void out()</span><br><span class="line"> {</span><br><span class="line"> if(!flag)</span><br><span class="line"> try{this.wait();}catch(Exception e){}</span><br><span class="line"> System.out.println(name+"........"+sex);</span><br><span class="line"> flag = false;</span><br><span class="line"> this.notify();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class Input implements Runnable</span><br><span class="line">{</span><br><span class="line"> private Res r ;</span><br><span class="line"> Input(Res r)</span><br><span class="line"> {</span><br><span class="line"> this.r = r;</span><br><span class="line"> }</span><br><span class="line"> public void run()</span><br><span class="line"> {</span><br><span class="line"> int x = 0;</span><br><span class="line"> while(true)</span><br><span class="line"> {</span><br><span class="line"> if(x==0) </span><br><span class="line"> r.set("mike","man"); </span><br><span class="line"> else </span><br><span class="line"> r.set("丽丽","女女女女女"); </span><br><span class="line"> x = (x+1)%2;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class Output implements Runnable</span><br><span class="line">{</span><br><span class="line"> private Res r ;</span><br><span class="line"> </span><br><span class="line"> Output(Res r)</span><br><span class="line"> {</span><br><span class="line"> this.r = r;</span><br><span class="line"> }</span><br><span class="line"> public void run()</span><br><span class="line"> {</span><br><span class="line"> while(true)</span><br><span class="line"> {</span><br><span class="line"> r.out();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class InputOutputDemo</span><br><span class="line">{</span><br><span class="line"> public static void main(String[] args) </span><br><span class="line"> {</span><br><span class="line"> Res r = new Res();</span><br><span class="line"> new Thread(new Input(r)).start();</span><br><span class="line"> new Thread(new Output(r)).start();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">wait:暂停等待;</span><br><span class="line">notify(); 唤醒线程池第一个线程</span><br><span class="line">notifyAll(); 唤醒所有的线程数据</span><br><span class="line"></span><br><span class="line">都使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步才具有锁。</span><br><span class="line"></span><br><span class="line">为什么这些操作线程的方法要定义Object类中呢?</span><br><span class="line"></span><br><span class="line">因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁,</span><br><span class="line">只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。</span><br><span class="line">不可以对不同锁中的线程进行唤醒。</span><br><span class="line"></span><br><span class="line">也就是说,等待和唤醒必须是同一个锁。</span><br><span class="line"></span><br><span class="line">而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。</span><br></pre></td></tr></table></figure>
<h3 id="生产者-消费者"><a href="#生产者-消费者" class="headerlink" title="生产者/消费者"></a>生产者/消费者</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">对于多个生产者和消费者。</span><br><span class="line">为什么要定义while判断标记。</span><br><span class="line">原因:让被唤醒的线程再一次判断标记。</span><br><span class="line"></span><br><span class="line">为什么定义notifyAll,</span><br><span class="line">因为需要唤醒对方线程。</span><br><span class="line">因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待。</span><br><span class="line"></span><br><span class="line">class Resource</span><br><span class="line">{</span><br><span class="line"> private String name;</span><br><span class="line"> private int count = 1;</span><br><span class="line"> private boolean flag = false;</span><br><span class="line"> // t1 t2</span><br><span class="line"> public synchronized void set(String name)</span><br><span class="line"> {</span><br><span class="line"> while(flag)</span><br><span class="line"> try{this.wait();}catch(Exception e){}//t1(放弃资格) t2(获取资格)</span><br><span class="line"> this.name = name+"--"+count++;</span><br><span class="line"></span><br><span class="line"> System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);</span><br><span class="line"> flag = true;</span><br><span class="line"> this.notifyAll();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> // t3 t4 </span><br><span class="line"> public synchronized void out()</span><br><span class="line"> {</span><br><span class="line"> while(!flag)</span><br><span class="line"> try{wait();}catch(Exception e){}//t3(放弃资格) t4(放弃资格)</span><br><span class="line"> System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);</span><br><span class="line"> flag = false;</span><br><span class="line"> this.notifyAll();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class Producer implements Runnable</span><br><span class="line">{</span><br><span class="line"> private Resource res;</span><br><span class="line"></span><br><span class="line"> Producer(Resource res)</span><br><span class="line"> {</span><br><span class="line"> this.res = res;</span><br><span class="line"> }</span><br><span class="line"> public void run()</span><br><span class="line"> {</span><br><span class="line"> while(true)</span><br><span class="line"> {</span><br><span class="line"> res.set("+商品+");</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class Consumer implements Runnable</span><br><span class="line">{</span><br><span class="line"> private Resource res;</span><br><span class="line"></span><br><span class="line"> Consumer(Resource res)</span><br><span class="line"> {</span><br><span class="line"> this.res = res;</span><br><span class="line"> }</span><br><span class="line"> public void run()</span><br><span class="line"> {</span><br><span class="line"> while(true)</span><br><span class="line"> {</span><br><span class="line"> res.out();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="生产者消费者JDK5-0升级版"><a href="#生产者消费者JDK5-0升级版" class="headerlink" title="生产者消费者JDK5.0升级版"></a>生产者消费者JDK5.0升级版</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">JDK1.5 中提供了多线程升级解决方案。</span><br><span class="line">将同步Synchronized替换成现实Lock操作。</span><br><span class="line">将Object中的wait,notify notifyAll,替换了Condition对象。</span><br><span class="line">该对象可以Lock锁 进行获取。</span><br><span class="line">该示例中,实现了本方只唤醒对方操作。</span><br></pre></td></tr></table></figure>
<p><strong>Lock:</strong> 替代了Synchronized<br> lock<br> unlock<br> newCondition()</p>
<p><strong>Condition:</strong> 替代了Object wait notify notifyAll<br> await();<br> signal();<br> signalAll();</p>
<p><strong>例如</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line">class Resource</span><br><span class="line">{</span><br><span class="line"> private String name;</span><br><span class="line"> private int count = 1;</span><br><span class="line"> private boolean flag = false;</span><br><span class="line"> // t1 t2</span><br><span class="line"> private Lock lock = new ReentrantLock();</span><br><span class="line"></span><br><span class="line"> private Condition condition_pro = lock.newCondition();</span><br><span class="line"> private Condition condition_con = lock.newCondition();</span><br><span class="line"></span><br><span class="line"> public void set(String name)throws InterruptedException</span><br><span class="line"> {</span><br><span class="line"> lock.lock();</span><br><span class="line"> try</span><br><span class="line"> {</span><br><span class="line"> while(flag)</span><br><span class="line"> condition_pro.await();//t1,t2</span><br><span class="line"> this.name = name+"--"+count++;</span><br><span class="line"> System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);</span><br><span class="line"> flag = true;</span><br><span class="line"> condition_con.signal();</span><br><span class="line"> }</span><br><span class="line"> finally</span><br><span class="line"> {</span><br><span class="line"> lock.unlock();//释放锁的动作一定要执行。</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> // t3 t4 </span><br><span class="line"> public void out()throws InterruptedException</span><br><span class="line"> {</span><br><span class="line"> lock.lock();</span><br><span class="line"> try</span><br><span class="line"> {</span><br><span class="line"> while(!flag)</span><br><span class="line"> condition_con.await();</span><br><span class="line"> System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);</span><br><span class="line"> flag = false;</span><br><span class="line"> condition_pro.signal();</span><br><span class="line"> }</span><br><span class="line"> finally</span><br><span class="line"> {</span><br><span class="line"> lock.unlock();</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class Producer implements Runnable</span><br><span class="line">{</span><br><span class="line"> private Resource res;</span><br><span class="line"></span><br><span class="line"> Producer(Resource res)</span><br><span class="line"> {</span><br><span class="line"> this.res = res;</span><br><span class="line"> }</span><br><span class="line"> public void run()</span><br><span class="line"> {</span><br><span class="line"> while(true)</span><br><span class="line"> {</span><br><span class="line"> try</span><br><span class="line"> {</span><br><span class="line"> res.set("+商品+");</span><br><span class="line"> }</span><br><span class="line"> catch (InterruptedException e)</span><br><span class="line"> {</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class Consumer implements Runnable</span><br><span class="line">{</span><br><span class="line"> private Resource res;</span><br><span class="line"></span><br><span class="line"> Consumer(Resource res)</span><br><span class="line"> {</span><br><span class="line"> this.res = res;</span><br><span class="line"> }</span><br><span class="line"> public void run()</span><br><span class="line"> {</span><br><span class="line"> while(true)</span><br><span class="line"> {</span><br><span class="line"> try</span><br><span class="line"> {</span><br><span class="line"> res.out();</span><br><span class="line"> }</span><br><span class="line"> catch (InterruptedException e)</span><br><span class="line"> {</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="停止线程"><a href="#停止线程" class="headerlink" title="停止线程"></a>停止线程</h3><p><strong>stop方法已经过时,如何停止线程?</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">只有一种,run方法结束。开启多线程运行,运行代码通常是循环结构。</span><br><span class="line"></span><br><span class="line">只要控制住循环,就可以让run方法结束,也就是线程结束。</span><br></pre></td></tr></table></figure></p>
<p><strong>特殊情况:</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">当线程处于了冻结状态。</span><br><span class="line">就不会读取到标记。那么线程就不会结束。</span><br><span class="line"></span><br><span class="line">当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。</span><br><span class="line">强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。</span><br><span class="line"></span><br><span class="line">Thread类提供该方法 interrupt();</span><br></pre></td></tr></table></figure></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">class StopThread implements Runnable</span><br><span class="line">{</span><br><span class="line"> private boolean flag =true;</span><br><span class="line"> public void run()</span><br><span class="line"> {</span><br><span class="line"> while(flag)</span><br><span class="line"> { </span><br><span class="line"> System.out.println(Thread.currentThread().getName()+"....run");</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> public void changeFlag()</span><br><span class="line"> {</span><br><span class="line"> flag = false;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">class StopThreadDemo</span><br><span class="line">{</span><br><span class="line"> public static void main(String[] args) </span><br><span class="line"> {</span><br><span class="line"> StopThread st = new StopThread();</span><br><span class="line"> </span><br><span class="line"> Thread t1 = new Thread(st);</span><br><span class="line"> Thread t2 = new Thread(st);</span><br><span class="line"> // 标记为守护线程</span><br><span class="line"> t1.setDaemon(true);</span><br><span class="line"> t2.setDaemon(true);</span><br><span class="line"> t1.start();</span><br><span class="line"> t2.start();</span><br><span class="line"></span><br><span class="line"> int num = 0;</span><br><span class="line"></span><br><span class="line"> while(true)</span><br><span class="line"> {</span><br><span class="line"> if(num++ == 60)</span><br><span class="line"> {</span><br><span class="line"> //st.changeFlag();</span><br><span class="line"> //t1.interrupt();</span><br><span class="line"> //t2.interrupt();</span><br><span class="line"> break;</span><br><span class="line"> }</span><br><span class="line"> System.out.println(Thread.currentThread().getName()+"......."+num);</span><br><span class="line"> }</span><br><span class="line"> System.out.println("over");</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br></pre></td><td class="code"><pre><span class="line">进程:正在执行的程序。</span><br><span class="line"></span><br><span class="line">线程:是进程中用于控制程序执行的控制单元(执行路径,执行情景)</span><br><span class="line"></span><br><span class="line">进程中至少有一个线程。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">对于JVM,启动时,只好有两个线程:jvm的主线程。jvm的垃圾回收线程。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">如何在程序中自定义线程呢?</span><br><span class="line"></span><br><span class="line">Java给我们提供了对象线程这类事物的描述。该类是Thread</span><br><span class="line"></span><br><span class="line">该类中定义了,</span><br><span class="line">创建线程对象的方法(构造函数).</span><br><span class="line">提供了要被线程执行的代码存储的位置(run())</span><br><span class="line"></span><br><span class="line">还定义了开启线程运行的方法(start()).</span><br><span class="line">同时还有一些其他的方法用于操作线程:</span><br><span class="line"> static Thread currentThead():</span><br><span class="line"> String getName():</span><br><span class="line"> static void sleep(time)throws InterruptedException:</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">要运行的代码都是后期定义的。</span><br><span class="line">所以创建线程的第一种方式是:继承Thread类。原因:要覆盖run方法,定义线程要运行的代码。</span><br><span class="line"></span><br><span class="line">步骤:</span><br><span class="line">1,继承Thread类。</span><br><span class="line">2,覆盖run方法。将线程要运行的代码定义其中。</span><br><span class="line">3,创建Thread类的子类对象,其实就是在创建线程,调用start方法。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">如果自定义的类中有多线程要运行的代码。但是该类有自己的父类。</span><br><span class="line">那么就不可以在继承Thread。怎么办呢?</span><br><span class="line"></span><br><span class="line">Java给我们提供了一个规则。Runnable接口。</span><br><span class="line">如果自定义类不继承Thread,也可以实现Runnable接口。并将多线程要运行的代码存放在Runnable的run方法中。</span><br><span class="line">这样多线程也可以帮助该类运行。</span><br><span class="line">这样的操作有一个好处:避免了单继承的局限性。</span><br><span class="line"></span><br><span class="line">创建线程的第二种方式:实现Runnable接口。</span><br><span class="line"></span><br><span class="line">步骤:</span><br><span class="line">1,定义了实现Runnable接口。</span><br><span class="line">2,覆盖接口的run方法。将多线程要运行的代码存入其中。</span><br><span class="line">3,创建Thread类的对象(创建线程),并将Runnable接口的子类对象作为参数传递给Thread的构造函数。</span><br><span class="line"> 为什么要传递?因为线程要运行的代码都在Runnable子类的run方法中存储。所以要将该run方法所属的对象</span><br><span class="line"> 传递给Thread。让Thread线程去使用该对象调用其run方法。</span><br><span class="line">4,调用Thread对象的start方法。开启线程。</span><br><span class="line"></span><br><span class="line">动手写代码。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">两种方式的特点:</span><br><span class="line">实现方式,因为避免了单继承的局限性,所以创建线程建议使用第二种方式。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">##############################</span><br><span class="line">#第一重点:创建线程的两种方式#</span><br><span class="line">##############################</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">作为了解:</span><br><span class="line">线程的状态。</span><br><span class="line">1,被创建。</span><br><span class="line">2,运行。</span><br><span class="line">3,冻结。</span><br><span class="line">4,消亡。</span><br><span class="line"></span><br><span class="line">其实还有一种特殊的状态:临时状态。</span><br><span class="line"></span><br><span class="line">该临时状态的特点:</span><br><span class="line">具备了执行资格,但不具备执行权。</span><br><span class="line"></span><br><span class="line">冻结状态的特点:</span><br><span class="line">放弃了执行资格。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">多线程具备随机性。因为是由cpu不断的快速切换造成的。</span><br><span class="line"></span><br><span class="line">就有可能会产生多线程的安全问题。</span><br><span class="line"></span><br><span class="line">问题的产生的原因:</span><br><span class="line">几个关键点:</span><br><span class="line">1,多线程代码中有操作共享数据。</span><br><span class="line">2,多条语句操作该共享数据。</span><br><span class="line"></span><br><span class="line">当具备两个关键点时,</span><br><span class="line">有一个线程对多条操作共享数据的代码执行的一部分。还没有执行完,另一个线程开始参与执行。</span><br><span class="line">就会发生数据错误。</span><br><span class="line"></span><br><span class="line">解决方法:</span><br><span class="line">当一个线程在执行多条操作共享数据代码时,其他线程即使获取了执行权,也不可以参与操作。</span><br><span class="line"></span><br><span class="line">Java就对这种解决方式提供了专业的代码。</span><br><span class="line">同步</span><br><span class="line">同步的原理:就是将部分操作功能数据的代码进行加锁。</span><br><span class="line"></span><br><span class="line">示例:火车上的卫生间。</span><br><span class="line"></span><br><span class="line">同步的表现形式:</span><br><span class="line">1,同步代码块。</span><br><span class="line">2,同步函数。</span><br><span class="line">两者有什么不同:</span><br><span class="line">同步代码块使用的锁是任意对象。</span><br><span class="line">同步函数使用的锁是this。</span><br><span class="line"></span><br><span class="line">注意:对于static的同步函数,使用的锁不是this。是 类名.class 是该类的字节码文件对象。</span><br><span class="line"> 涉及到了单例设计模式的懒汉式。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">同步的好处:解决了线程的安全问题。</span><br><span class="line"></span><br><span class="line">弊端:</span><br><span class="line"> 较为消耗资源。</span><br><span class="line"> 同步嵌套后,容易死锁。</span><br><span class="line"></span><br><span class="line">要记住:同步使用的前提:</span><br><span class="line"> 1,必须是两个或者两个以上的线程。</span><br><span class="line"> 2,必须是多个线程使用同一个锁。</span><br><span class="line"> 这是才可以称为这些线程被同步了。</span><br><span class="line"></span><br><span class="line">死锁代码一定会写。但开发时一定注意避免。</span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category> java </category>
</categories>
<tags>
<tag> java </tag>
</tags>
</entry>
<entry>
<title><![CDATA[JAVA笔记(十一)]]></title>
<url>/2013/09/25/JAVA-11/</url>