0

我正在开发一个应用程序,它从设备(或者可能是保管箱或驱动器)上的多个 .json 文件中读取数据

用户使用 ACTION_GET_CONTENT 意图选择这些文件。此意图返回所选文件的 URI,我从中获取路径,这些路径被发送到 AsyncTask 以在后台加载。

在 android 4.4 之前,这工作正常。现在,某些内容选择器(尤其是 android 自己的“下载”活动)返回不包含实际文件名或路径的 uri。

不幸的是 AsyncTask 迫使您覆盖 doInBackground(String... filenames) - 它采用一系列字符串作为文件名。我可能会以某种方式序列化 uri 并将它们在文件名参数中传递给方法,但现在我认为这显然不是意图。

因此,它促使我提出一个问题:有没有更好的方法来做到这一点?

允许用户在 KitKat 中选择和加载一系列文件的正确方法是什么

4

1 回答 1

1

而不是使用AsyncTask<String, Object, Object>你可以使用AsyncTask<URI, Object, Object>. 这会将您更改doInBackground(String... args)doInBackground(URI... args). 这将要求您对所有文件路径使用 URI 而不是字符串。

如果要使用非泛型 AsyncTask 类,则必须使用该doInBackground(Object... args)方法(非类型安全)。

但是,使用泛型 AsyncTask<Params, Progress, Result>类允许您指定类型参数。Paramsvarargs类型相关doInBackground(Params... args)Progress与 varargs 类型相关,protected void onProgressUpdate(Progress... args)Result与 的返回类型protected Result doInBackground以及参数类型相关protected void onPostExecute(Result arg)

在这种情况下,最好使用泛型类型,因为它们没有运行时错误(但不是编译时错误)。对于传递类型 Object 引用的非泛型 AsyncTask 则不能这样说。

于 2014-01-04T01:44:02.023 回答