2013-12-24 2 views
0

консоли разработчика Google Play, сообщил, что метод File.toURI() вызвал ANR (приложение не отвечает) ошибки:ANR при вызове File.toURI()

at libcore.io.Posix.stat(Native Method) 
at libcore.io.ForwardingOs.stat(ForwardingOs.java:131) 
at java.io.File.isDirectory(File.java:529) 
at java.io.File.getAbsoluteName(File.java:1104) 
at java.io.File.toURI(File.java:1062) 
at com.mypackage.myclass.<init>(SourceFile:1234) 

Есть альтернативный способ сделать это в основном потоке (потому что использование фонового потока кажется излишним)?

+0

Я сомневаюсь, что File.toUri может вызвать ANR. Также, не взглянув на код, невозможно понять, что происходит. – Blackbelt

+0

File.toURI() вызывает File.isDirectory(), поэтому это не слишком удивительно ... –

ответ

0

Выполнение задач непосредственно в пользовательском интерфейсе или основной нити не рекомендуется. В вашем случае попробуйте AsyncTask. Посмотрите пример here.

+0

Я ищу способ получить тот же результат, что и File.toURI(), не вызывая в файловой системе. Например, если я уже знаю, что File является каталогом, тогда нет необходимости (косвенно) вызывать File.isDirectory() –

+0

@MarkCarter: AsyncTask - это то, как я знаю об исключении ANR. – ChuongPham

+0

Другой способ - избежать ненужных операций ввода-вывода. Пожалуйста, см. Мой ответ. –

0

Если путь к файлу уже абсолютный путь, и вы уже знаете, является ли файл каталога:

public static String toURI(File f, boolean isDirectory) { 
    try { 
     String sp = slashify(f.getPath(), isDirectory); 
     if (sp.startsWith("//")) { 
      sp = "//" + sp; 
     } 
     return new URI("file", null, sp, null); 
    } 
    catch (URISyntaxException x) { 
     throw new Error(x);   // Can't happen 
    } 
} 

private static String slashify(String path, boolean isDirectory) { 
    String p = path; 
    if (File.separatorChar != '/') 
     p = p.replace(File.separatorChar, '/'); 
    if (!p.startsWith("/")) 
     p = "/" + p; 
    if (!p.endsWith("/") && isDirectory) 
     p = p + "/"; 
    return p; 
} 
Смежные вопросы