0

デバイス (またはおそらくドロップボックス、またはドライブ) 上の複数の .json ファイルからデータを読み取るアプリを開発しています。

ユーザーは ACTION_GET_CONTENT インテントを使用してこれらのファイルを選択します。このインテントは、選択したファイルの URI を返します。そこからパスを取得し、バックグラウンドでロードするために AsyncTask に送信します。

Android 4.4 より前では、これは正常に機能していました。現在、特定のコンテンツ チューザー (特に Android 独自の「ダウンロード」アクティビティ) は、実際のファイル名やパスを含まない URI を返します。

残念ながら、AsyncTask では doInBackground(String... filenames) をオーバーライドする必要があります。これは、一連の文字列をファイル名として受け取ります。おそらくURIを何らかの方法でシリアル化し、それらをファイル名パラメーターでメソッドに渡すことができましたが、今では明らかに意図していなかったと考えています。

したがって、質問をするよう促されています。これを行うためのより良い方法はありますか?

ユーザーがキットカットで一連のファイルを選択してロードできるようにする正しい方法は何ですか?

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 に答える