【问题标题】:Github API getting files data from directoriesGithub API 从目录中获取文件数据
【发布时间】:2019-09-10 15:14:28
【问题描述】:

我正在尝试使用 Github API 来获取我创建的目录的内容。

这是我的目录结构:

  • 图片
    • mobile_images
      • img1241251235
        • extractedText.txt
        • img.jpeg(这些文件可能大于 1MB)
      • img2142412312
        • extractedText.txt
        • img.jpeg

如您所见,我知道在images/mobile_images/ 目录中有一堆目录遵循一个结构。

我想从这些目录中提取每个extractedText.txt 文件的内容(存储在该文件中的文本)并保存每个img.jpeg 的download_url。

我遵循的步骤是:

  1. 在根目录 (images/mobile_images) 上,我调用 this 方法并获取其中的目录列表 (this response)。所以我得到img124...img214...等等。

  2. 现在我得到了所有目录(imgXX.. 的),我对每个目录调用相同的方法来获取它们的内容。这将返回 extractedText.txtimg.jpeg。 (步骤 1 的响应。)

到目前为止一切顺利。

现在,如果我在文件上调用相同的方法,它应该返回 this。这适用于 extractedText.txt 文件,因为它们的大小不大于 1 MB,但对于图像文件,它将引发错误。

我想获取如下所示的对象列表:

Image(val name: String, //this is something I extract from img123...
val date: Long, //this is something I extract from img123...
val extractedText: String, //this should be the text from extractedText.txt
val url: String) //this should be the download_url of img.jpeg file

你可以找到我当前的代码here

that point 之前一切正常。当我到达该文件时,我需要检查它是文本文件还是图像文件。

问题是我不知道如何管理that“if case”,然后将我得到的数据(download_urlextractedText content)合并到一个图像对象中。这是我不知道如何处理的代码部分:

// from here starts the problem 
 .flatMap(object:
  Function < ResponseBody, Observable < Any >> {
   override fun apply(responseBody: ResponseBody): Observable < Any > {
    return
    if (responseBody.path.contains("txt", true)) {
 // if the file is a text file I need to get the content of the file so I'll call this
     mModel.getFile(responseBody.path) as Observable < Any >
    } else {
 // as I mentioned if the file is an img I only need to get download_url
     responseBody.download_url
    }
   }
  })
 // merge the data into an Image file
 .toList()
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(object: Consumer < MutableList < Image >> {
 // ...
  1. 有没有更简单的方法来解决这个问题?
  2. 我的方法可以吗?
  3. 如何处理“如果”情况以及如何将数据合并到单个 Image 对象中?

【问题讨论】:

    标签: android kotlin rx-java github-api


    【解决方案1】:

    我设法实施了一个临时解决方案。

    我写了两个会返回的函数:

    1. an Observable of the list 包含来自方法 mModel.getFile(responseBody.path) 的数据
    2. an Observable of the list 包含 responseBody.download_url

    在我得到两个 observable 之后,我使用 .zip() 方法和 this combine 方法合并它们:

    Observable.zip(getImageDataObservable(),
      getImageDownloadUrlObservable(),
      object: BiFunction < MutableList < Image > , MutableList < Image > , List < Image >> {
       override fun apply(imageData: MutableList < Image > , imageUrl: MutableList < Image > ): List < Image > {
        return combineImageObservables(imageData, imageUrl)
       }
      })
     .subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(object: Consumer < List < Image >> {
      override fun accept(images: List < Image > ? ) {
       Log.d(TAG, "images = ${images?.size}")
       Log.d(TAG, images.toString())
    
       if (images != null) {
        mViewDelegate.showImages(images)
       } else {
        mViewDelegate.showError("Try again!")
       }
    
       mViewDelegate.showSuccess("Displaying ${images?.size} images")
       mViewDelegate.hideLoading()
      }
     }, object: Consumer < Throwable > {
      override fun accept(t: Throwable ? ) {
       Log.e(TAG, t.toString(), t)
       if (t != null) {
        mViewDelegate.showError(t.message)
       } else {
        mViewDelegate.showError("Error")
       }
       Crashlytics.logException(t)
       mViewDelegate.hideLoading()
      }
     })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多