android 怎么上传一个String数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 怎么上传一个String数组相关的知识,希望对你有一定的参考价值。

String[] a = "", "" ;这是个String数组,我要上传到服务器,直接上传会报错,不能直接上传数组对象。! 求解

上传String数组可以将其转换成string类型,每个数组元素之间添加一个你自己定义的 分隔符 比如“| #$”等。用socket或http上传。
很多时候 安卓与服务商交互 较多采用的数据格式是 JSON 和 XML。可以将其 包装为JSON 格式。JSON 格式比较简单。
JSON 工具类有 GSON android也自带Json包,可以方便使用,String数组转成JsonArray 再上传就行了。
参考技术A 建议将数组结构变为json结构:
"string1":"11111","string2":"22222","string3":"33333"
然后上传至服务器后解析即可。

望采纳本回答被提问者和网友采纳

使用 DispatchQueue 实现 Swift 数组同步

【中文标题】使用 DispatchQueue 实现 Swift 数组同步【英文标题】:Swift Array Synchronization with DispatchQueue 【发布时间】:2020-03-24 04:20:59 【问题描述】:

如果从同一个线程(线程 1 主线程)调用 uploadFailed(for id: String)uploadSuccess()updateOnStart(_ id: String),我知道我们不需要同步队列。如果每次上传时从不同的线程调用函数怎么办。我在哪里确保同步?是上传和状态还是只是状态?

enum FlowState 
 case started(uploads: [String])
 case submitted
 case failed


class Session 
 var state: FlowState
 let syncQueue: DispatchQueue = .init(label: "Image Upload Sync Queue",
                                      qos: .userInitiated,
                                      attributes: [],
                                      autoreleaseFrequency: .workItem)

 init(state: FlowState) 
   self.state = state
 

 mutating func updateOnStart(_ id: String) 
  guard case .started(var uploads) = state else 
    return
  

  uploads.append(id)

  state = .started(uploads)


  mutating func uploadFailed(for id: String) 
   guard case .started(var uploads) = state else 
    return
   

   uploads.removeAll  $0 == id 

   if uploads.isEmpty 
      state = .failed
    else 
      state = .started(uploads)
   
 

 mutating func uploadSuccess() 
  state = .submitted
 


我们是否同步uploads 数组操作和如下状态?

syncQueue.sync 
  uploads.append(id)

  state = .started(uploads)



syncQueue.sync 
  uploads.removeAll  $0 == id 

   if uploads.isEmpty 
      state = .failed
    else 
      state = .started(uploads)
   

syncQueue.sync 
  state = .started(uploads)


syncQueue.sync 
  if uploads.isEmpty 
    state = .failed
   else 
    state = .started(uploads)
  

网络调用的完成处理程序可以更新Sessionstate 属性。例如,用户选择 10 张图像并上传。完成后,它可能是失败或成功。对于我们上传的每张图片,我们都会缓存资源id,如果上传失败,我们会将其删除。当所有图片上传失败时,我们更新状态.failed。我们只关心上传一张图片。当单张图片上传时,我们将状态更新为.submitted

【问题讨论】:

您所说的“是上传和状态还是只是状态?”是什么意思? 您能提供您具体用例的背景吗?你想做什么? @JoshWolff 我用更多信息更新了问题 “如果每次上传时从不同的线程调用函数怎么办” 也许这似乎是一种肤浅的反应,但我的第一个想法是确保不会发生这种情况是你的工作。 .? 回调尚未创建,其他人将处理异步同时上传的上传。这只是一个后备 【参考方案1】:

使用同步来确保与FlowState 的线程安全交互是完全有效的。

一些观察:

    您提出了两种选择:

    syncQueue.sync 
        uploads.append(id)
    
        self.state = .started(uploads)
    
    

    或者

    syncQueue.sync 
        state = .started(uploads)
    
    

    这些都不对。如果线程 1 和线程 2 同时调用这个例程怎么办?考虑:

    线程 1 检索到 uploads 线程 2 检索到相同的uploads; 然后线程 1 进入它的 sync 块并将一条记录附加到它的本地副本,保存它,然后离开它的 sync 闭包; 然后线程 2 进入它的 sync 块并将不同的记录附加到它自己的本地副本(没有由线程 1 添加的记录),保存它,然后离开它的 sync 闭包。 

    在这种情况下,您将丢失附加的线程 1。

    因此,您需要采用第三种更广泛的同步机制,将检索、附加和存储uploads 的整个过程封装在一个同步机制中:

    syncQueue.sync 
        guard case .started(var uploads) = self.state else 
            return
        
    
        uploads.append(id)
    
        state = .started(uploads)
    
    

    如果您还没有,我建议您在开发和测试期间打开thread sanitizer (TSAN)。它可能会帮助您发现这些问题。

    您没有显示任何对 state 的额外读取,但如果有任何其他读取,请确保您也同步读取。与state 的所有交互都必须同步。

    一个微妙的问题:如果您要同步对 state 的访问,请确保将其设置为 private,以便没有外部代码可以访问它(否则您可能会阻碍您确保线程安全的交互)。您需要将所有读取和写入都包含在同步机制中。

    您可能也应该将同步队列设为私有,因为也不需要公开它。

【讨论】:

谢谢罗伯。那真的很有帮助。 public private(set) var state: FlowState 状态只能公开阅读 无意冒犯,但是当您可能正在写作时,您不能让其他线程阅读此内容。您不想公开任何未同步的访问,即使只是读取。

以上是关于android 怎么上传一个String数组的主要内容,如果未能解决你的问题,请参考以下文章

android怎么把json转换为hashmap

在Android中将ArrayList转换为String数组

Android byte数组保存为jpg图片

android怎么在array配置文件中添加图片资源数组

在 C# 中将 Base64 字节数组解码为图像

LeetCode10.Array and String —Reverse String 字符数组逆置