SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 04 авг 2013, 13:52
Написал класс который отображает в ImageView картинку которая лежит в SDCARD.
Код: Выделить всё
public class ShowPictureInSD {
public static String ROOT_DIR="mydir";
public Bitmap ShowPicture(String fileName, String contentType, String id, ImageView pic) {
File dir = new File(Environment.getExternalStorageDirectory() + File.separator + ROOT_DIR + File.separator + contentType + File.separator + id);
dir.mkdirs();
File f = new File (dir, fileName+".png");
Log.d("ShowPictureInSD", "Поиск картинки: "+f.getAbsolutePath());
if (f.exists()){
Bitmap bm = BitmapFactory.decodeFile(f.getAbsolutePath());
pic.setImageBitmap(bm);
}else{
Log.d("ShowPictureInSD", "Картинка ненайдена!");
return null;
}
return null;
}
}
Все проверял, путь к файлу в порядке, формирование Bitmam - нет ошибки....
Ошибка возникает на этом шаге:
pic.setImageBitmap(bm);
Вот лог:
Код: Выделить всё
07-17 04:28:54.488: D/ShowPictureInSD(23003): Поиск картинки: /mnt/sdcard/HomeAndroid/app/1806/1371276396440921M.png
07-17 04:28:54.618: D/dalvikvm(23003): GC_CONCURRENT freed 224K, 4% free 8212K/8519K, paused 152ms+22ms, total 251ms
07-17 04:28:54.628: D/dalvikvm(23003): WAIT_FOR_CONCURRENT_GC blocked 37ms
07-17 04:28:54.688: W/dalvikvm(23003): threadid=12: thread exiting with uncaught exception (group=0x40a13300)
07-17 04:28:54.738: E/AndroidRuntime(23003): FATAL EXCEPTION: Thread-3679
07-17 04:28:54.738: E/AndroidRuntime(23003): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4609)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:835)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:292)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.widget.ScrollView.requestLayout(ScrollView.java:1419)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.view.View.requestLayout(View.java:15129)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.widget.ImageView.setImageDrawable(ImageView.java:401)
07-17 04:28:54.738: E/AndroidRuntime(23003): at android.widget.ImageView.setImageBitmap(ImageView.java:416)
07-17 04:28:54.738: E/AndroidRuntime(23003): at com.net.homeandroid.ShowPictureInSD.ShowPicture(ShowPictureInSD.java:23)
07-17 04:28:54.738: E/AndroidRuntime(23003): at com.net.homeandroid.Main$1.run(Main.java:89)
В чем здесь проблема?
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 04 авг 2013, 14:13
можно ж хотя бы скопировать ошибку и в гугл транслейт, в лог не одно слово пишется а всё подробно:
Only the original thread that created a view hierarchy can touch its views.
обращаешься к UI не из UI потока.
R.id.team
Политика на форуме запрещена
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 04 авг 2013, 14:15
rezak90 писал(а):можно ж хотя бы скопировать ошибку и в гугл транслейт, в лог не одно слово пишется а всё подробно:
Only the original thread that created a view hierarchy can touch its views.
обращаешься к UI не из UI потока.
Код: Выделить всё
if (f.exists()){
((Object) activity).runOnUiThread(new Runnable() {
@Override
public void run() {
Bitmap bm = BitmapFactory.decodeFile(f.getAbsolutePath());
pic.setImageBitmap(bm);
}
});
}
То он рагуется на
runOnUiThread и
pic
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 04 авг 2013, 16:29
Вот переделал класс:
Код: Выделить всё
public class ShowPictureInSD {
public String ROOT_DIR="HomeAndroid";
public String fileName;
public String id;
public String contentType;
final ImageView pic;
public Context activity;
public ShowPictureInSD(String fileName, String contentType, String id, ImageView pic, Context activity){
this.fileName=fileName;
this.id=id;
this.contentType=contentType;
this.pic=pic;
this.activity=activity;
ShowPicture();
}
public Bitmap ShowPicture() {
File dir = new File(Environment.getExternalStorageDirectory() + File.separator + ROOT_DIR + File.separator + contentType + File.separator + id);
dir.mkdirs();
final File f = new File (dir, fileName+".png");
Log.d("ShowPictureInSD", "Поиск картинки: "+f.getAbsolutePath());
if (f.exists()){
//Bitmap bm = BitmapFactory.decodeFile(f.getAbsolutePath());
//pic.setImageBitmap(bm);
((Object) activity).runOnUiThread(new Runnable() {
@Override
public void run() {
Bitmap bm = BitmapFactory.decodeFile(f.getAbsolutePath());
pic.setImageBitmap(bm);
}
});
}else{
Log.d("ShowPictureInSD", "Картинка ненайдена!");
return null;
}
return null;
}
}
Теперь runOnUiThread, когда наводиш предлагает: "change cast of activity"
Если делать так: ((Object) activity).runOnUiThread(new Runnable(){... то ошибка таже остается..
Добавлено через 11 минут
Еще так переделал:
Код: Выделить всё
if (f.exists()){
new Thread() {
@Override
public void run() {
Bitmap bm = BitmapFactory.decodeFile(f.getAbsolutePath());
pic.setImageBitmap(bm);
}
}.start();
}
Но в логах - та же ошибка... незнаю уже что делать?
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 04 авг 2013, 19:02
((Object) activity).runOnUiThread(new Runnable()
вот мне интересно, что с подвигает писать вот такое, даже не знаю как это назвать... одно из двух:
а) это тупо скопировано от куда то;
б) пишется абы как... но даже абы как в голову не помещается;
если по пункту
б, то если пишешь то руководствуешься чем то... там справкой или советом или кофейной гущей (у кого как). Не ужели у Object есть метод runOnUiThread ? Ясное дело что нету вот умный Eclipse и подчёркивает. Хотя бы в
справку заглянул бы, а лучше начал бы с Java.
R.id.team
Политика на форуме запрещена
-
sanu0074
- Сообщения: 80
- Зарегистрирован: 30 июн 2013, 20:42
-
Контактная информация:
Сообщение
sanu0074 » 04 авг 2013, 20:19
Так работает
Код: Выделить всё
((Activity)activity).runOnUiThread(new Runnable() {
@Override
public void run() {
Bitmap bm = BitmapFactory.decodeFile(f.getAbsolutePath());
pic.setImageBitmap(bm);
pic.clearAnimation();
pic.setScaleType(ScaleType.FIT_CENTER);
}
});
пишется абы как... но даже абы как в голову не помещается;
А как вобще тогда правильно писать?
p.s. Справкой не пользуюсь, т.к. неоч хорошо владею английским...
p.p.s. Я недавно начал изучать программирование android, до этого догло занимался web-программированием.....
-
rezak90
- Сообщения: 3422
- Зарегистрирован: 26 июн 2012, 13:22
- Откуда: UA
-
Контактная информация:
Сообщение
rezak90 » 04 авг 2013, 21:04
sanu0074 писал(а):p.p.s. Я недавно начал изучать программирование android, до этого догло занимался web-программированием.....
тогда надо было с Java начинать
R.id.team
Политика на форуме запрещена