Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Github API从目录获取文件数据_Android_Kotlin_Rx Java_Github Api - Fatal编程技术网

Android Github API从目录获取文件数据

Android Github API从目录获取文件数据,android,kotlin,rx-java,github-api,Android,Kotlin,Rx Java,Github Api,我试图使用GithubAPI来获取我创建的目录的内容 这是我的目录结构: 图像 移动图像 IMG124125123 extractedText.txt img.jpeg(这些文件可能大于1MB) img2142412312 extractedText.txt img.jpeg 正如您所看到的,我知道在images/mobile\u images/目录中有一组遵循某种结构的目录 从这些目录中,我想提取每个extractedText.txt文件(存储在该文件中的文本)的内容,并保

我试图使用GithubAPI来获取我创建的目录的内容

这是我的目录结构:

  • 图像
    • 移动图像
      • IMG124125123
        • extractedText.txt
        • img.jpeg(这些文件可能大于1MB)
      • img2142412312
        • extractedText.txt
        • img.jpeg
正如您所看到的,我知道在
images/mobile\u images/
目录中有一组遵循某种结构的目录

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

我的步骤如下:

  • 在根目录(images/mobile_images)上,我调用方法并获得其中目录的列表()。所以我得到了
    img124…
    img214…
    等等

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

  • 到目前为止还不错

    现在,如果我对一个文件调用相同的方法,它应该返回。这适用于
    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
    
    你可以找到我当前的代码

    一切顺利,直到明天。当我到达该文件时,我需要检查它是文本文件还是图像文件

    问题是我不知道如何管理“if case”,然后将我得到的数据(
    download\u url
    extractedText 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 >> {
     // ...
    
    //问题从这里开始
    .flatMap(对象:
    功能>{
    覆盖乐趣应用(responseBody:responseBody):可观察{
    返回
    if(responseBody.path.contains(“txt”,true)){
    //如果文件是一个文本文件,我需要得到文件的内容,所以我称之为
    mModel.getFile(responseBody.path)作为可观察的
    }否则{
    //正如我提到的,如果文件是img,我只需要获得下载url
    responseBody.download\u url
    }
    }
    })
    //将数据合并到图像文件中
    托利斯先生()
    .observeOn(AndroidSchedulers.mainThread())
    .订阅(对象:消费者>{
    // ...
    
  • 有没有更简单的方法来解决这个问题
  • 我的方法行吗
  • 如何处理这种“如果”情况,如何将数据合并到单个图像对象中

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

    我编写了两个将返回的函数:

  • 包含来自方法的数据
    mModel.getFile(responseBody.path)
  • 包含
    响应库。下载\u url
  • 在获得两个观察值后,我使用
    .zip()
    方法和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()
      }
     })
    
    Observable.zip(getImageDataObservable(),
    getImageDownloadUrlObservable(),
    对象:双功能,MutableList,List>{
    覆盖应用(imageData:MutableList,imageUrl:MutableList):List{
    返回combineImageObservables(imageData、imageUrl)
    }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .订阅(对象:消费者>{
    覆盖乐趣接受(图像:列表<图像>?){
    Log.d(标记“images=${images?.size}”)
    Log.d(标记,images.toString())
    如果(图像!=null){
    mViewDelegate.showImages(图像)
    }否则{
    mViewDelegate.batherror(“再试一次!”)
    }
    mViewDelegate.showSuccess(“显示${images?.size}图像”)
    mViewDelegate.hideLoading()
    }
    },对象:消费者<可丢弃>{
    覆盖乐趣接受(t:可丢弃?){
    Log.e(标记,t.toString(),t)
    如果(t!=null){
    mViewDelegate.BREASHROR(t.message)
    }否则{
    mViewDelegate.showError(“错误”)
    }
    Crashlytics.logException(t)
    mViewDelegate.hideLoading()
    }
    })
    
    我设法实现了一个临时解决方案

    我编写了两个将返回的函数:

  • 包含来自方法的数据
    mModel.getFile(responseBody.path)
  • 包含
    响应库。下载\u url
  • 在获得两个观察值后,我使用
    .zip()
    方法和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()
      }
     })
    
    Observable.zip(getImageDataObservable(),
    getImageDownloadUrlObservable(),
    对象:双功能,MutableList,List>{
    覆盖应用(imageData:MutableList,imageUrl:MutableList):List{
    返回combineImageObservables(imageData、imageUrl)
    }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .订阅(对象:消费者>{
    覆盖乐趣接受(图像:列表<图像>?){
    Log.d(标记“images=${images?.size}”)
    Log.d(标记,images.toString())
    如果(图像!=null){
    mViewDelegate.showImages(图像)
    }否则{
    mViewDelegate.batherror(“再试一次!”)
    }
    mViewDelegate.showSuccess(“显示${images?.size}图像”)
    mViewDelegate.hideLoading()
    }
    },对象:消费者<可丢弃>{
    覆盖乐趣接受(t:可丢弃?){
    Log.e(标记,t.toString(),t)
    如果(t!=null){
    mViewDelegate.BREASHROR(t.message)
    }否则{
    mViewDelegate.showError(“错误”)
    }
    Crashlytics.logException(t)
    mViewDelegate.hideLoading()
    }
    })