RxJava和网络调用给出“打开文件过多错误”

时间:2018-11-05 14:59:55

标签: android jsoup rx-java

我正在尝试获取某些名人的 Instagram 用户名。我有这些名人的名字,从这些名字中,我想搜索Google并从搜索结果中获取用户名。我不想使用需要注册且有很多限制的Google或Instagram API。

因此,我只是在强求这些搜索(例如1000名名人)。获得名人用户名后,我将其保存在 Firebase

这就是我的做法。

以下功能仅在Google中搜索名称+“官方instagram” ,并获得第一个结果和第一个标题。

private fun googleSearch(name: String): Observable<String> {
    return Observable.fromCallable {
        val strUrl = "https://www.google.com/search?q=$name+official+instagram"
        val doc = Jsoup.connect(strUrl).get()
        val table = doc!!.select("h3")
        table.first().text()
    }
}

下面是我正在为1000个用户运行的迭代。

disposable.add(Observable.just(users)
        .subscribeOn(Schedulers.io())
        .flatMap { users: MutableList<User> -> Observable.fromIterable(users) }
        .flatMap( { user: User -> googleSearch(user.name))},
                {user: User, username: String -> Pair(user, username)}
        )
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe{ pair ->
            val username = pair.second
            val user = pair.first
            if (username.contains("Instagram photos")){
                firebaseRootRef.child(user.id).child("instagramId").setValue(extractInstagUsername(username))
            }
        })

以下功能只是从搜索结果中获取确切的用户名。

private fun extractInstagUsername(title: String): String {
    return StringUtils.substringBetween(title, "@", ")")
}

当我运行代码时,它可以为30-40个用户运行,但随后因错误而崩溃

  

E / NativeCrypto:AppData :: create pipe(2)失败:打开的文件太多

我所缺少的东西以及如何解决这个问题?

0 个答案:

没有答案