2016-10-26 2 views
0

Я использую GridView для загрузки изображений данных json. Когда я построил проект это произошло несколько исключенийFileNotFoundException:/storage/emulated/0/JsonParseTutorialCache: open failed: ENOENT (Нет такого файла или каталога)

AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

класс файлового кэша:

public class FileCache { 

private File cacheDir; 

public FileCache(Context context) { 
    // Find the dir to save cached images 
    if (android.os.Environment.getExternalStorageState().equals(
      android.os.Environment.MEDIA_MOUNTED)) 
     cacheDir = new File(
       android.os.Environment.getExternalStorageDirectory(), 
       "JsonParseTutorialCache"); 
    else 
     cacheDir = context.getCacheDir(); 
    if (!cacheDir.exists()) 
     cacheDir.mkdirs(); 
} 

public File getFile(String url) throws IOException { 
    String filename = String.valueOf(url.hashCode()); 
    // String filename = URLEncoder.encode(url); 
    File f = new File(cacheDir, filename); 
    f.createNewFile(); 
    return f; 
} 

public void clear() { 
    File[] files = cacheDir.listFiles(); 
    if (files == null) 
     return; 
    for (File f : files) 
     f.delete(); 
} 

}

Logcat:

W/System.err: java.io.IOException: open failed: ENOENT (No such file or directory) 
W/System.err:  at java.io.File.createNewFile(File.java:939) 
W/System.err:  at com.totoroads.android.app.FileCache.getFile(FileCache.java:33) 
W/System.err:  at com.totoroads.android.app.ImageLoader.getBitmap(ImageLoader.java:64) 
W/System.err:  at com.totoroads.android.app.ImageLoader.access$000(ImageLoader.java:29) 
W/System.err:  at com.totoroads.android.app.ImageLoader$PhotosLoader.run(ImageLoader.java:155) 
W/System.err:  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
W/System.err:  at java.lang.Thread.run(Thread.java:818) 
W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 
W/System.err:  at libcore.io.Posix.open(Native Method) 
W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
W/System.err:  at java.io.File.createNewFile(File.java:932) 
W/System.err: ... 9 more 

Я тусклый t для загрузки, чтения и отображения изображений в GridView, как исправить эти исключения?

+0

«/ storage/emulated/0/JsonParseTutorialCache/-1068682472« Я не думаю, что это допустимый путь к файлу для изображения. Вы должны проверить правильность выбора имени файла. –

+0

Я получаю изображения по параметру: TAG_ICONNAME = "image" (from json) – luongkhanh

+0

Пожалуйста, отправьте образец ответа json тоже. –

ответ

1

Код в FileCache.java является

public File getFile(String url) { 
    String filename = String.valueOf(url.hashCode()); 
    // String filename = URLEncoder.encode(url); 
    File f = new File(cacheDir, filename); 
    return f; 
} 

Новый объект файл был создан, но файл может не существовать. Таким образом, замените приведенный выше код на

public File getFile(String url) { 
    String filename = String.valueOf(url.hashCode()); 
    // String filename = URLEncoder.encode(url); 
    File f = new File(cacheDir, filename); 
    f.createNewFile(); 
    return f; 
} 

Надеюсь, это помогает.

Редактировать: Когда вы запускаете свой код на> = Android 6.0, вам нужно запросить разрешение на доступ к Внешнему хранилищу во время выполнения. Добавление в AndroidManifest.xml недостаточно. Вы можете использовать this link о том, как это сделать.

+0

@ TheAburd: я обновил ваш код, это похожее на ошибку, вы можете увидеть Logcat – luongkhanh

+0

Вы используете этот код в Marshmallow или выше? –

+0

У меня нет ответа на вопрос, но мой код работает в среде разработки (андроидная студия) – luongkhanh

1

Вы можете использовать библиотеку Picasso для отображения изображений в режиме сетки. он предоставляет один код линии для изображения нагрузки. Используйте функцию библиотеки нагрузки images--

Picasso.with (контекст) .load ("YOURIMAGE") .into (ImageView);

Вы также можете изменить размер изображений в соответствии с вашими требованиями. и также управлять внутренним механизмом кэширования

см ссылку для получения дополнительной информации - http://square.github.io/picasso/

+0

Я попробую и вернусь к вам – luongkhanh

+0

Спасибо за советы по поводу пикассо, это сработало для меня – luongkhanh