在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:MeiZiNews开源软件地址:https://gitee.com/qq137712630/MeiZiNews开源软件介绍:2016/4/29 GitHub:https://github.com/qq137712630/MeiZiNews 碗豆夹下载地址:http://www.wandoujia.com/apps/com.ms.meizinewsapplication #MeiZiNews
#夜间模式:Colorful 问题RecyclerView的个别item的颜色还是前一个主题的地址:https://github.com/hehonghui/Colorful/issues/5 最后我在 clearRecyclerViewRecyclerBin下, 增加((RecyclerView) rootView).getRecycledViewPool().clear();`解决了public class RecyclerViewSetter extends ViewGroupSetter { public RecyclerViewSetter(ViewGroup targetView, int resId) { super(targetView, resId); } public RecyclerViewSetter(ViewGroup targetView) { super(targetView); } @Override protected void clearRecyclerViewRecyclerBin(View rootView) { super.clearRecyclerViewRecyclerBin(rootView); ((RecyclerView) rootView).getRecycledViewPool().clear(); } @Override public void setValue(Resources.Theme newTheme, int themeId) { clearRecyclerViewRecyclerBin(mView); // 遍历子元素与要修改的属性,如果相同那么则修改子View的属性 for (ViewSetter setter : mItemViewSetters) { for (int i = 0; i < ((RecyclerView) mView).getAdapter().getItemCount(); i++) { View itemView = ((RecyclerView) mView).getChildAt(i); if (itemView == null) { continue; } boolean isBaseAdapterHelper = ((RecyclerView) mView).getChildViewHolder(itemView) instanceof BaseAdapterHelper; if (!isBaseAdapterHelper) { continue; } BaseAdapterHelper baseAdapterHelper = (BaseAdapterHelper) ((RecyclerView) mView).getChildViewHolder(itemView); setter.mView = baseAdapterHelper.getView(setter.mViewId); int itemId = setter.getViewId(); if (baseAdapterHelper.getView(itemId) == null) { continue; } setter.setValue(newTheme, themeId); } } }} #RxJava RxBus-事件总线按照以下顺序阅读的话,大概就理解如何使用了 取消订阅多线程切换RxJava 使用:给 Android 开发者的 RxJava 详解 图中共有 5 处含有对事件的操作。 由图中可以看出,①和②两处受第一个 subscribeOn() 影响,运行在红色线程; ③和④处受第一个 observeOn() 的影响,运行在绿色线程; ⑤处受第二个 observeOn() 影响,运行在紫色线程; 而第二个 subscribeOn() ,由于在通知过程中线程就被第一个 subscribeOn() 截断,因此对整个流程并没有任何影响。 这里也就回答了前面的问题:当使用了多个 subscribeOn() 的时候,只有第一个 subscribeOn() 起作用。
#GreenDAO
联表查询DbUtil/** * Built SQL for query: * SELECT T."_id",T."HTML_ID",T."COLLECT" FROM "COLLECT_ENTITY" T * JOIN HTML_ENTITY J1 ON T."HTML_ID"=J1."_id" * WHERE J1."URL"=? * * @param url * @return */public List<CollectEntity> queryCollectByhtmlUrl(String url) { QueryBuilder<CollectEntity> queryBuilder = collectEntityDao.queryBuilder(); queryBuilder.join(CollectEntityDao.Properties.Html_id, HtmlEntity.class, HtmlEntityDao.Properties.Id) .where(HtmlEntityDao.Properties.Url.eq(url)); return queryBuilder.list();} #Retrofit 使用 ##转换器 retrofitRxAndroid+Retrofit环境搭建 转换器可以被添加到支持其他类型。六兄弟模块适应流行的序列化库为您提供方便。Converters can be added to support other types. Six sibling modules adapt popular serialization libraries for your convenience. Gson: com.squareup.retrofit2:converter-gsonJackson: com.squareup.retrofit2:converter-jacksonMoshi: com.squareup.retrofit2:converter-moshiProtobuf: com.squareup.retrofit2:converter-protobufWire: com.squareup.retrofit2:converter-wireSimple XML: com.squareup.retrofit2:converter-simplexmlScalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars 直接返回String类型需引入:ScalarsConverterFactory.create() retrofit = new Retrofit.Builder() .client(MyOkHttpClient.getMyOkHttpClient().getOkHttpClient())//设置不同的底层网络库 .baseUrl(strBaseUrl) .addConverterFactory(ScalarsConverterFactory.create())//添加 String类型[ Scalars (primitives, boxed, and String)] 转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加 RxJava 适配器 .build(); 返回Gson类型需引入:GsonConverterFactory.create() retrofit = new Retrofit.Builder() .client(MyOkHttpClient.getMyOkHttpClient().getOkHttpClient())//设置不同的底层网络库 .baseUrl(strBaseUrl) .addConverterFactory(GsonConverterFactory.create())//添加 json 转换器 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加 RxJava 适配器 .build(); ##Retrofit 结合 RxJava使用
##使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求 okhttp 请求设置官方文档使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求OuNews 新闻:RetrofitManager类下的 initOkHttpClient 方法okhttp3.X,retrofit:2.0.0-beta4适用
Retrofit 如何使用Observable.from发出多条连接的?参考 ````` MzituImgListModel ````/** * Retrofit 使用Observable.from发出多条连接 * @param context * @param listener * @return */@Overridepublic Subscription loadWeb(final Context context, final OnModelListener<ImgItem> listener) { MyStringRetrofit.getMyStringRetrofit().init(context, MeiZiApi.MZITU_API); final MzituApi mzituApi = MyStringRetrofit.getMyStringRetrofit().getCreate(MzituApi.class); Observable observable = mzituApi.RxImgList( MyOkHttpClient.getCacheControl(context), imgId, page ).flatMap( new Func1<String, Observable<Integer>>() { @Override public Observable<Integer> call(String s) { // 第一次请求先请求页数,从而获得要发的链接数 Elements mElements = JsoupUtil.getMzituImgPage(s); Elements tempElements = mElements.select("span"); String size = tempElements.get(tempElements.size() - 2).text(); if (TextUtils.isEmpty(size)) { return null; } ArrayList<Integer> numList = new ArrayList<Integer>(); for (int i = 1; i <= Integer.parseInt(size); i++) { numList.add(i); } return Observable.from(numList); } } ).flatMap( new Func1<Integer, Observable<String>>() { @Override public Observable<String> call(Integer integer) { // 发出单次网络请求连接 return mzituApi.RxImgList( MyOkHttpClient.getCacheControl(context), imgId, integer + "" ); } } ).map( new Func1<String, ImgItem>() { @Override public ImgItem call(String s) { // 处理每次请问的结果 ImgItem img = new ImgItem(); Elements mElements = JsoupUtil.getMzituImgItem(s); Element tempElement = mElements.first(); img.setImgUrl(tempElement.select("img").attr("src")); img.setUrl(tempElement.select("img").attr("src")); img.setStory_title(tempElement.select("img").attr("alt")); return img; } } ); return RxJavaUtil.rxIoAndMain( observable, new Subscriber<ImgItem>() { @Override public void onCompleted() { listener.onCompleted(); } @Override public void onError(Throwable e) { listener.onError(e.toString()); DebugUtil.debugLogErr(e, e.toString()); } @Override public void onNext(ImgItem imgItem) { listener.onSuccess(imgItem); } } );} 问题集其他笔记@Path:路径 @Query:查询条件,如: xx=yy 如果有多个查询条件可以使用: #API ##视频直播 通过webview打开HTML5页面用自己的浏览器点直播MP4和M3U8【M3U8】测试地址及android播放器 ###斗鱼 分类 http://www.douyu.com/directory 进入分类 http://www.douyu.com/directory/game/DOTA2?page=2&isAjax=1 HTML5版-房间信息 http://m.douyu.com/html5/live?roomId=73334{ "error": 0, "msg": "ok", "data": { "room_id": "73334", "tag_name": "DOTA2", "room_src": "http://rpic.douyucdn.cn/z1605/01/15/73334_160501151547.jpg", "room_name": "重返8000之路!7600", "show_status": "1", "online": 13126, "nickname": "两仪落214", "hls_url": "http://hls3a.douyutv.com/live/73334rRfZajWPCGs_550/playlist.m3u8?wsSecret=c52bca967d3b341d878291b7901c800b&wsTime=1462084010", "is_pass_player": false, "is_ticket": 0 }} 熊猫TV分类: http://www.panda.tv/cate 分页 http://www.panda.tv/ajax_sort?pageno=1&pagenum=20&classification=lolhttp://www.panda.tv/ajax_sort?token=&pageno=2&pagenum=120&classification=lol 房间: http://www.panda.tv/354095 房间信息 http://room.api.m.panda.tv/index.php?method=room.shareapi&roomid=354095http://room.api.m.panda.tv/index.php?method=room.shareapi&roomid=354095&callback=jQuery1910274208655487177_1462807801662&_=1462807801663http://room.api.m.panda.tv/index.php?method=room.recommend&callback=jQuery1910274208655487177_1462807801664&_=1462807801665 妹子图集// 专题http://www.mzitu.com/zhuanti// 首页http://www.mzitu.com/http://www.mzitu.com/page/1// 热门http://www.mzitu.com/hothttp://www.mzitu.com/hot/page/2// 推荐http://www.mzitu.com/besthttp://www.mzitu.com/best/page/2// 性感妹子http://www.mzitu.com/xingganhttp://www.mzitu.com/xinggan/page/2// 日本妹子http://www.mzitu.com/japanhttp://www.mzitu.com/japan/page/2// 台湾妹子http://www.mzitu.com/taiwanhttp://www.mzitu.com/taiwan/page/2// 清纯http://www.mzitu.com/mmhttp://www.mzitu.com/mm/page/2// 图集查看http://www.mzitu.com/{图集ID}/{页数}http://www.mzitu.com/65054/48 永久免费的基于深度学习的中文在线抽词-PullWord永久免费的基于深度学习的中文在线抽词-PullWordAPI 使用 API: http://103.37.149.178:16888/pullword/get.php?source=清华大学是好学校¶m1=0¶m2=1 知乎日报//Zhihu APIpublic static final String BASE_URL = "http://news-at.zhihu.com/api/4/news/";//日报详情public static final String NEWS_LATEST = "http://news-at.zhihu.com/api/4/news/latest";//最新日报public static final String NEWS_BEFORE = "http://news-at.zhihu.com/api/4/news/before/";//指定日期的日报public static final String SPLASH = "http://news-at.zhihu.com/api/4/start-image/1080*1920";//封面http://news-at.zhihu.com/api/4/themes // 主题日报列表查看http://news-at.zhihu.com/api/4/theme/{id} //主题日报内容查看
豆瓣美女public static String DB_BREAST = "http://www.dbmeinv.com/dbgroup/show.htm?cid=2&pager_offset=";public static String DB_BUTT = "http://www.dbmeinv.com/dbgroup/show.htm?cid=6&pager_offset=";public static String DB_SILK = "http://www.dbmeinv.com/dbgroup/show.htm?cid=7&pager_offset=";public static String DB_LEG = "http://www.dbmeinv.com/dbgroup/show.htm?cid=3&pager_offset=";public static String DB_RANK="http://www.dbmeinv.com/dbgroup/rank.htm?pager_offset="; Android开发技术周报网址 例子: http://androidweekly.cn/page/2/ #MD实践
##侧滑 NavigationView 最快的方法是创一下新的侧滑模块
设置item颜色代码中: int[][] states = new int[][] { new int[] { android.R.attr.state_selected }, // selected new int[] { android.R.attr.state_focused, android.R.attr.state_pressed }, // pressed new int[] { }, // default};int[] colors = new int[] { 0, 0, getColor(newTheme)};navigationView.setItemTextColor(new ColorStateList( states, colors)); Xml <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" android:background="?attr/root_view_bg" app:headerLayout="@layout/nav_header_main" app:itemTextColor="?attr/text_color" app:menu="@menu/activity_main_drawer" /> ##上下拉:SwipeRefreshLayout
头部: CoordinatorLayout CollapsingToolbarLayout
CoordinatorLayout总结: 为了使得Toolbar有滑动效果,必须做到如下三点: 注:CoordinatorLayout如果是最外的布局要去掉: 1、CoordinatorLayout必须作为整个布局的父布局容器。2、 给需要滑动的组件设置 app:layout_scrollFlags=”scroll|enterAlways” 属性。3、给你的可滑动的组件,也就是RecyclerView 或者 NestedScrollView 设置如下属性: app:layout_behavior="@string/appbar_scrolling_view_behavior" RecyclerViewRecyclerView使用介绍base-adapter-helper的RecyclerView版 上下拉监听
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { onListScrolled(); } } }); RecyclerView多Item的情况其中 getItemViewType 用来返回当前项是哪种类型布局, getViewTypeCount 返回当前ListView总共多少种类型的布局如果在 RecyclerView 实现多种Item,只需要实现一个 getItemType 方法,用来返回item的种类 在 onCreateViewHolder 和 onBindViewHolder 方法中,第二个参数就是item的类型 GlideGithub Android 开源库Other
疑问
奇怪的错误:由编译时出现的错误:通过清理项目的缓存可解决。 第1个: 04-19 20:57:09.844 31614-31614/com.ms.meizinewsapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: com.ms.meizinewsapplication, PID: 31614 java.lang.NoSuchMethodError: No virtual method setMenuItemIconByCollect(Z)V in class Lcom/ms/meizinewsapplication/features/main/iview/DevWeekDetailIVew; or its super classes (declaration of 'com.ms.meizinewsapplication.features.main.iview.DevWeekDetailIVew' appears in /data/data/com.ms.meizinewsapplication/files/instant-run/dex/slice-slice_4-classes.dex) at com.ms.meizinewsapplication.features.main.activity.DevWeekDetailActivity$2.onMenuItemClick(DevWeekDetailActivity.java:160) at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:169) at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:760) at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811) at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958) at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948) at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:618) at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:139) at android.view.View.performClick(View.java:4908) at android.view.View$PerformClick.run(View.java:20378) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5691) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 第2个: 04-19 20:13:37.194 5338-5416/com.ms.meizinewsapplication E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-2 Process: com.ms.meizinewsapplication, PID: 5338 java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread. at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:62) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:818) Caused by: java.lang.NoSuchMethodError: No virtual method addCollectByUrl(Ljava/lang/String;Ljava/lang/String;)Z in class Lcom/ms/meizinewsapplication/features/base/utils/db/DbUtil; or its super classes (declaration of 'com.ms.meizinewsapplication.features.base.utils.db.DbUtil' appears in /data/data/com.ms.meizinewsapplication/files/instant-run/dex/slice-slice_9-classes.dex) at com.ms.meizinewsapplication.features.base.model.CollectModel$1.call(CollectModel.java:44) at com.ms.meizinewsapplication.features.base.model.CollectModel$1.call(CollectModel.java:39) at rx.internal.operators.OperatorMap$1.onNext(OperatorMap.java:54) at rx.internal.util.ScalarSynchronousObservable$1.call(ScalarSynchronousObservable.java:46) at rx.internal.util.ScalarSynchronousObservable$1.call(ScalarSynchronousObservable.java:35) at rx.Observable$2.call(Observable.java:162) at rx.Observable$2.call(Observable.java:154) at rx.Observable.unsafeSubscribe(Observab |
请发表评论