2018-03-07 20:20:21 u011562187 阅读数 2687
  • Retrofit 从入门封装到源码解析

    该教程从Retrofit的入门开始讲解,然后搭配Rxjava使用,主要讲解在实战项目中如何进行Retrofit封装(主要涉及到OkHttp,部分涉及到Retrofit),后会对源码进行解析,让你知其然,知其所以然。

    10085 人正在学习 去看看 张旭童

Android 5.0 以下(使用Android 4.4 模拟器测试),使用ReactNative 调用fetch 访问https接口,始终返回Network Request Failed.
Debug 进入RN的java代码,发现是RN调用okhttp 报错SSLException:ssl handshake aborted
这里写图片描述

单独调用okhttp ,不使用RN 也会报错,所以这个错误跟RN无关,只是我是写RN时遇到的.
https://github.com/facebook/react-native/issues/10404 github上也有很多这个问题的讨论,原因不尽相同.

搜索一番之后,说是android API level 20 以下TLS 1.1 1.2默认关闭.
下面网址是官网描述
https://developer.android.com/reference/javax/net/ssl/SSLSocket.html?hl=zh-cn
这里写图片描述

但是我按网上相关方法enable 之后还是不行.(react-native 其实已经enable了,可以查看
com.facebook.react.modules.network.OkHttpClientProvider,代码如下)

  /*
    On Android 4.1-4.4 (API level 16 to 19) TLS 1.1 and 1.2 are
    available but not enabled by default. The following method
    enables it.
   */
  public static OkHttpClient.Builder enableTls12OnPreLollipop(OkHttpClient.Builder client) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) {
      try {
        client.sslSocketFactory(new TLSSocketFactory());

        ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                .tlsVersions(TlsVersion.TLS_1_2)
                .build();

        List<ConnectionSpec> specs = new ArrayList<>();
        specs.add(cs);
        specs.add(ConnectionSpec.COMPATIBLE_TLS);
        specs.add(ConnectionSpec.CLEARTEXT);

        client.connectionSpecs(specs);
      } catch (Exception exc) {
        FLog.e("OkHttpClientProvider", "Error while enabling TLS 1.2", exc);
      }
    }

    return client;
  }

进一步发现是server 支持的Clipher Suites 的问题:
使用https://www.ssllabs.com/ssltest/index.html 输入Api 的https网址(https://XXX.com)进行测试.

这张是服务器只开了Tls 1.2时的结果:
这里写图片描述

这张是服务器开了Tls 1.1 和 1.2时的结果:
这里写图片描述

区别就在于
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA和TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
这2个Clipher Suites.
然后查看上面官网SSL的描述,发现这2个Clipher Suites从API 11开始支持,而其他的都是API 20+才支持,而测试的结果也是只开了Tls 1.2的时候无法访问,报SSLException:ssl handshake aborted,而开了Tls 1.1之后就可以正常访问了.
这里写图片描述

所以随后,解决这个问题,需要:
1.在Android 5.0以前,Enable Tls 1.2
2.服务器配置恰当的协议.

2018-07-04 09:20:34 jupiter_888 阅读数 4
  • Retrofit 从入门封装到源码解析

    该教程从Retrofit的入门开始讲解,然后搭配Rxjava使用,主要讲解在实战项目中如何进行Retrofit封装(主要涉及到OkHttp,部分涉及到Retrofit),后会对源码进行解析,让你知其然,知其所以然。

    10085 人正在学习 去看看 张旭童
  • 多元思维模型;

  • 一级
    搞好android常用控件,并学会初步自定义控件;
    会使用okHttp等网络框架;

  • 二级
    会用c/c++编程;
    会用各种开发框架,会写ReactNative

2017-01-16 15:01:12 qq1377399077 阅读数 2740
  • Retrofit 从入门封装到源码解析

    该教程从Retrofit的入门开始讲解,然后搭配Rxjava使用,主要讲解在实战项目中如何进行Retrofit封装(主要涉及到OkHttp,部分涉及到Retrofit),后会对源码进行解析,让你知其然,知其所以然。

    10085 人正在学习 去看看 张旭童

一、
初始化state报错:null is not a object (evaluating‘this.state.value’)
语法:

getInitialState () {  
       return {num: 0};  
 } 

以上的初始化state是使用createClass 创建组件时的语法,当我们用es6语法时,需要放在constructor ()内

//用到es6的时候初始化state应该在constructor ()内,而不是用getInitialState()   
class Search extends Component {  
  constructor () {  
    super();  
    this.state = {  
      ....  
    }  
  }  
  ...  
}  

二、
expected a component class,got[object Object]

遇到该错误原因大致是render方法中的组件代码写错了,RN组件都是大写开头,如:,所以遇到这个错误先检查自己代码是否出现了小写开头。

三、
红屏问题”Could not get BatchedBridge, make sure your bundle is packaged correctly”
解决方案:在报错的页面,点击菜单键,选择Dev Settings,点击Dubug server host & port for device,设置IP和端口,cmd命令ipconfig找出自己的本机ip后面接8081端口,然后返回刷新界面或者重新运行,ok了。
如果上述步骤仍旧不能解决继续看:
在package.json中的”scripts”中添加
“bundle-android”:”react-native bundle –platform android –dev false –entry-file index.android.js –bundle-output android/app/src/main/assets/index.android.bundle –sourcemap-output android/app/src/main/assets/index.android.map –assets-dest android/app/src/main/res/”,

添加完后,根目录下运行:
react-native bundle –platform android –dev false –entry-file index.android.js –bundle-output android/app/src/main/assets/index.android.bundle –sourcemap-output android/app/src/main/assets/index.android.map –assets-dest android/app/src/main/res/,
如果出现如下错误:
这里写图片描述
没有assets目录,手动添加下重新运行即可。

四、
昨天写了个小功能,也运行了,可以没有问题,回到家后,再次打开运行项目,发现项目界面成了创建项目时的欢迎界面,reload后报错,就想到估计是DEV Setings没有设置Debug servers host,(ip:8081).reload后就可以了。

五、
Execution failed for task ‘:app:compileDebugJavaWithJavac’.

Could not find tools.jar
参考:
android - Execution failed for task ‘:app:compileDebugJavaWithJavac’
jdk环境变量配置

错误的原因是没有安装java SDK.官网选择下载对应的SDK。安装即可。
注意:自定义安装后,自定义路径下面下的是jre,比如,我自定义安装路径为F:\ProgramFiles\java\jre1.8.0_111,java\jre1.8.0_111是默认安装路径的字段,照搬过来。安装成功后,
JDK被放在了C:\Program Files\Java\jdk1.8.0_111目录下面。

安装成功后,需要设置环境变量。[查看原文]
右击“我的电脑”=》”system”=》“advanced system setting”=》“environment variable”

1)在系统变量里新建JAVA_HOME变量,变量值为:C:\Program Files\Java\jdk1.8.0_111(根据自己的安装路径填写)
2)新建classpath变量,变量值为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
3)在path变量(已存在不用新建)添加变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin(注意变量值之间用“;”隔开)
4)“开始”–>“运行”–>输入“javac”–>”Enter”,如果能正常打印用法说明配置成功!

补充环境变量:
JAVA_HOME:jdk的安装路径
classpath:java加载类路径,只有类在classpath中java命令才能识别,在路径前加了个”.”表示当前路径。
path:系统在任何路径下都可以识别java,javac命令

六、
Error:Could not expand ZIP *.aar

解决方法:出现这种情况一般是权限问题,所以使用管理员身份运行即可解决(右键该文件,选择管理员取得权限)

如果是android请在取得权限后clean project或者到项目目录android/app/下删除build文件夹在运行

七、
使用realm数据库需要注意的几点:
在 MainApplication 中添加

import io.realm.react.RealmReactPackage;

 @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
          new RealmReactPackage()
      );
    }

..\node_modules\realm\android\build\outputs\aar\下的aar文件需要右键选择管理员获取所有权

八、
当我在js中使用map函数时,竟然报了一个警告:warning: each child in an array or iterator should have a unique key prop。
虽然警告并不影响界面,但是对于强迫症的我来说就。。。
一下是我的代码:

<ScrollView  style={styles.container}>
        <View style={styles.container}>
          {
            cars.map((value , key) => {
              return (
                <View style={styles.realmItem}>
                  <View style={styles.realmItemLeft}>
                    <Text style={ styles.realmItemText }>{value.name}</Text>
                    <Text style={ styles.realmItemText }>{value.dept}</Text>
                  </View>
                  <View style={styles.realmItemRigth}>
                    <Text>{value.phone}</Text>
                  </View>
                </View>
                );
            })
          }
        </View>
      </ScrollView>

解决办法:在view的属性中加入key=key就可以了,下面是更改后的代码:

<ScrollView  style={styles.container}>
        <View style={styles.container}>
          {
            cars.map((value , key) => {
              return (
                <View key={key} style={styles.realmItem}>
                  <View style={styles.realmItemLeft}>
                    <Text style={ styles.realmItemText }>{value.name}</Text>
                    <Text style={ styles.realmItemText }>{value.dept}</Text>
                  </View>
                  <View style={styles.realmItemRigth}>
                    <Text>{value.phone}</Text>
                  </View>
                </View>
                );
            })
          }
        </View>
      </ScrollView>

九、
realm at path already opened on current thread with different schema
当我们在应用的两个功能模块中如果都采用realm数据库,那么我们需要在使用过realm后关闭改签数据连接对象即:

realm = new Realm({schema: [user]});
realm.close();

如果不关闭,第二次打开realm时就会出现该错误

十、
从0.44版本开始,Navigator不再从‘react-native’中引入,而是需要npm install react-native-deprecated-custom-components –save并在代码中import {Navigator} from ‘react-native-deprecated-custom-components’.
同样从0.44版本开始,BackAndroid组件不在出现,而是用用‘BackHandler’代替

2017-08-03 11:43:01 yue31313 阅读数 148
  • Retrofit 从入门封装到源码解析

    该教程从Retrofit的入门开始讲解,然后搭配Rxjava使用,主要讲解在实战项目中如何进行Retrofit封装(主要涉及到OkHttp,部分涉及到Retrofit),后会对源码进行解析,让你知其然,知其所以然。

    10085 人正在学习 去看看 张旭童

自定义实现日历控件

即时通讯项目里面的语音处理

Android蓝牙本地操作

涟漪按钮效果

Android语音词典

APP内存优化

ReactNative基础与入门

Android记账本

自定义实现轮播图

Android视频播放器

Sqlite高级操作

Android依赖管理与私服搭建

APP换肤功能

网络框架OKHttp使用

Apk多渠道打包

Android侧滑菜单

长连接利器 ,网络框架解析之mina

Android 框架-  GreenDao

Andorid饼状账单

Android数据库解析应用

Android 压力测试

6.0新特性

Android data binding

Android各种drawable讲解

应用自动更新组件开发

360加速球效果

手机服务器微架构设计与实现

Android百度地图 导航

Android 摇一摇

Android打造酷炫进度条

QQ登录

Service之notification综合应用

Android studio技巧全集

Android 扫一扫

Android 五子连珠 游戏

Android 自定义viewPager指示器

AIDL 小白成长记

不一样的recyclerView优雅实现复杂列表布局

Android 快速实现不一样的拼图

Android 心愿分享

Android 面试揭秘 自定义view

Android 摄像头基础

Android widget桌面小组件

Android面试解密 layout weight

Android 多平台分享

Android 短信验证

Android 高级特效 索引

Android仿照微信图片选择器

Android屏幕适配全攻略

Volley详解

微信SDK 分享你的朋友圈

Android 实现抽奖转盘

懒人必备之 android 效率开发框架

Android精通Activity

重识activity

精通activity

Android 刷脸神器

Android ndk

Android 异步加载

Android 3d画廊

RecyclerView

节日短信送祝福

仿微信语音聊天

Android动画、

多线程断点续传下载

异步任务基础

打造万能适配器

Android http通信

baseAdapter的使用与优化

消息推送

LBS开发

利用高德云图在线制作属于你的地图

打造个性的图片浏览与多点触控

高德地图组件快速入门

使用高德地图定位进行开发

Android 图像处理 变换莫测的图片

Android 图像处理

Android 实现卫星菜单

Android 自定义任意层级树形控件

千变万化的ViewPager切换动画

Android图案解锁

Android美女拼图小游戏

多种多样的APP主界面tab实现方法

微信6.0主界面

百度地图在android中的使用

Android中的webView实战详解

Android面试常客Handler详解

电商活动中的刮刮卡

属性动画赏析

Android 后端服务 bmob

5.0新特性 materialDesign

Android中的流式布局 和热门标签

Android ui模板设计

Android模拟器Genymotion

Android 智能机器人

猜歌游戏

QQ5.0侧滑菜单

Android root技术原理

Android listview分页功能

下拉刷新

系统root原理

 

2017-03-13 15:24:38 LiugerLiu 阅读数 182
  • Retrofit 从入门封装到源码解析

    该教程从Retrofit的入门开始讲解,然后搭配Rxjava使用,主要讲解在实战项目中如何进行Retrofit封装(主要涉及到OkHttp,部分涉及到Retrofit),后会对源码进行解析,让你知其然,知其所以然。

    10085 人正在学习 去看看 张旭童

本文介绍面试可能常问的一些问题

1介绍一下经常浏览的android技术网站

developer(最重要的,安卓的基础知识都能找到)

github codekk (开源类网站)

stackoverflow(问答类,开发中遇见的问题,在这里几乎都能找到,也比较权威)


2使用过的三方开源库
OkHttp、EventBus、Glide、GreenDao、ReactNative等


3开发遇见的技术难题是什么,怎么解决的?



持续更新中...


没有更多推荐了,返回首页