在Android 4.4+中选择和加载文件

时间:2014-01-03 21:18:36

标签: android android-asynctask filechooser

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

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

在Android 4.4之前,这很好用。现在,某些内容选择器(特别是android自己的“下载”活动)返回不包含实际文件名或路径的uri。

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

因此,它促使我提出问题:有更好的方法吗?

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

1 个答案:

答案 0 :(得分:1)

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

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

但是,使用generic AsyncTask<Params, Progress, Result>类可以指定类型参数。 ParamsdoInBackground(Params... args)中的varargs类型相关联,Progressprotected void onProgressUpdate(Progress... args)中的varargs类型相关联,Resultprotected Result doInBackground的返回类型相关联{1}}以及protected void onPostExecute(Result arg)的参数类型。

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