我正在使用Android兼容性库,偶尔会变得很奇怪NullPointerException:
java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:960)
at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:768)
at android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.java:1104)
at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:410)
at android.support.v4.content.Loader.deliverResult(Loader.java:103)
at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:81)
at android.support.v4.content.CursorLoader.onStartLoading(CursorLoader.java:126)
at android.support.v4.content.Loader.startLoading(Loader.java:197)
at android.support.v4.app.LoaderManagerImpl$LoaderInfo.start(LoaderManager.java:262)
at android.support.v4.app.LoaderManagerImpl.doStart(LoaderManager.java:710)
at android.support.v4.app.Fragment.onStart(Fragment.java:981)
at android.support.v4.app.Fragment.performStart(Fragment.java:1332)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:906)
at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1240)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:612)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:433)
at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:405)
at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:386)
...
Run Code Online (Sandbox Code Playgroud)
显然,我做错了什么让它FragmentManager进入这样一个可能会崩溃的状态,但我不知道是什么.在相关的代码中FragmentManagerImpl没有提供我任何线索.我猜mActivity是null在某种程度上在代码中的那一点?但这似乎是不可能的,因为活动已经在屏幕上,我没有添加任何片段 - 只是在它们之间切换ViewPager.
我们在Android项目中使用okhttp与我们的API交谈; 所有通信都使用SSL/TLS加密,我们的服务器可以说SPDY.我们还在Google Play服务中为融合位置提供商和其他一些功能进行链接.
我们目前没有使用的Play服务的一部分是他们的安全提供商,它承诺升级设备的SSL堆栈以某种方式防止各种漏洞.但是,文档对于提供程序实际执行的操作以及SSL方法受其影响的内容有些模糊,哪些不是(提供了一些示例,但不是全面的列表).
所以,我想我的问题是双重的:
动态安全提供程序是否可以使用okhttp,或者okhttp是否依赖于不受安装提供程序影响的较低级别(或更高级别)的API?
假设它确实有效,有什么好处?是否值得关注安全利益?它实际上是否会修复okhttp 2.2中与ALPN相关的本机崩溃,正如nfuller提示的那样?
我正在试验OKHttp(版本2.0.0-RC2)和SPDY并且看到IOException: stream was reset: CANCEL了很多,可能是一些初步测试中所有请求的10%或更多.在使用Apache HttpClient和常规https时,就我所知,我们没有看到任何等效问题.我很确定当SPDY被禁用时我们也没有看到与OkHttp等效的东西(client.setProtocols(ImmutableList.of(Protocol.HTTP_1_1)))但我没有做足够的测试以100%自信.
这个先前的问题看到了这些异常,并且建议忽略它们,但这看起来很疯狂:我们在从服务器读取数据时遇到异常,因此我们中止数据处理代码(使用Jackson).在这种情况下我们需要做点什么.我们可以重试请求,当然,但有时它是一个POST请求,这是不重试的,如果我们已经开始从服务器接收数据,那么这是一个不错的选择,由于已经采取的请求的操作的服务器.
理想情况下,是客户端和/或我们能以减少这些异常的发生率做服务器的一些配置,但我不明白,SPDY不够好,甚至不知道从哪里开始寻找或建议我们的服务器管理员团队开始寻找.
堆栈跟踪,以防它有用:
java.io.IOException: stream was reset: CANCEL
at com.squareup.okhttp.internal.spdy.SpdyStream$SpdyDataSource.checkNotClosed(SpdyStream.java:442)
at com.squareup.okhttp.internal.spdy.SpdyStream$SpdyDataSource.read(SpdyStream.java:344)
at com.squareup.okhttp.internal.http.SpdyTransport$SpdySource.read(SpdyTransport.java:273)
at okio.RealBufferedSource.exhausted(RealBufferedSource.java:60)
at okio.InflaterSource.refill(InflaterSource.java:96)
at okio.InflaterSource.read(InflaterSource.java:62)
at okio.GzipSource.read(GzipSource.java:80)
at okio.RealBufferedSource$1.read(RealBufferedSource.java:227)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.loadMore(UTF8StreamJsonParser.java:174)
at com.fasterxml.jackson.core.base.ParserBase.loadMoreGuaranteed(ParserBase.java:431)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2111)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString(UTF8StreamJsonParser.java:2092)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:275)
at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:205)
at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeArray(JsonNodeDeserializer.java:230)
at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:202)
at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:58)
at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:15)
at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2765)
at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:1546)
at com.fasterxml.jackson.core.JsonParser.readValueAsTree(JsonParser.java:1363)
at (application-level code...)
Run Code Online (Sandbox Code Playgroud) 目前,我的应用可以帮助用户将单个事件添加到他们的Google日历中:
final Intent calendarIntent = new Intent(Intent.ACTION_EDIT)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.setType("vnd.android.cursor.item/event")
.putExtra("beginTime", startTime)
.putExtra("endTime", startTime + 7200000L) // 2 hours
.putExtra("title", name)
.putExtra("description", description.toString())
.putExtra("eventLocation", address);
// later
startActivity(calendarIntent);
Run Code Online (Sandbox Code Playgroud)
但是,许多用户希望自动将所有活动添加到他们的Google日历中.我们的服务器团队制作了一个ICS供稿,人们可以将其订阅为外部Google日历.但这涉及复制和粘贴URL,这对最终用户来说有点混乱.
在网络上,我们可以将人们链接到表单的网址http://www.google.com/calendar/render?cid=OUR_ICS_URL,他们可以相对轻松地从那里添加Feed.但是,当您在Android浏览器上访问此URL时,您会收到有关移动与桌面网站的各种奇怪的弹出窗口,甚至我们开发团队中的高级Android用户也无法弄清楚如何从那里添加日历.
我研究的另一件事是谷歌日历API,但看起来他们的日历列表插入方法需要谷歌日历ID,而不是外部日历的URL.
那么,这里有什么好的解决方案吗?似乎应该有一种方法可以帮助我们的用户订阅他们的日历,而无需他们去他们的桌面并打开一个完整大小的Web浏览器.但是我没有尝试过任何结果.
有什么想法吗?
android calendar google-calendar-api google-api android-calendar
在普通的无类型 JavaScript 中,编写一个可以对数字或 bigint 进行操作的函数并不难,具体取决于传入的参数:
\nconst sumOfSquares = (a,b) => a*a + b*b;\nsumOfSquares(3, 4); // returns 25\nsumOfSquares(3n, 4n); // returns 25n\nsumOfSquares(3n, 4); // throws a TypeError\nRun Code Online (Sandbox Code Playgroud)\n似乎应该有一种方法在打字稿中声明这个函数,以便编译器强制参数一起工作。我试过
\nconst sumOfSquares = <N extends bigint | number>(a: N, b: N): N =>\n a * a + b * b;\nRun Code Online (Sandbox Code Playgroud)\n但编译器拒绝了这一点:
\n\n\n语义错误 TS2322:类型“number”无法分配给类型“N”。
\n
\n\xc2\xa0 \'number\' 可分配给类型 \'N\' 的约束,但 \'N\' 可以使用约束 \'number | 的不同子类型来实例化。bigint\'。
是否有不同的方法来编写类型声明以使其起作用?
\nandroid ×4
java ×2
okhttp ×2
bigint ×1
calendar ×1
google-api ×1
javascript ×1
networking ×1
security ×1
spdy ×1
ssl ×1
types ×1
typescript ×1