ImageView - загрузка картинки из SDCARD

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

ImageView - загрузка картинки из SDCARD

Сообщение 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
Контактная информация:

Re: ImageView - загрузка картинки из SDCARD

Сообщение 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
Контактная информация:

Re: ImageView - загрузка картинки из SDCARD

Сообщение 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
Контактная информация:

Re: ImageView - загрузка картинки из SDCARD

Сообщение 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
Контактная информация:

Re: ImageView - загрузка картинки из SDCARD

Сообщение rezak90 » 04 авг 2013, 19:02

((Object) activity).runOnUiThread(new Runnable()
вот мне интересно, что с подвигает писать вот такое, даже не знаю как это назвать... одно из двух:
а) это тупо скопировано от куда то;
б) пишется абы как... но даже абы как в голову не помещается;
если по пункту б, то если пишешь то руководствуешься чем то... там справкой или советом или кофейной гущей (у кого как). Не ужели у Object есть метод runOnUiThread ? Ясное дело что нету вот умный Eclipse и подчёркивает. Хотя бы в справку заглянул бы, а лучше начал бы с Java.
R.id.team
Политика на форуме запрещена

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: ImageView - загрузка картинки из SDCARD

Сообщение 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
Контактная информация:

Re: ImageView - загрузка картинки из SDCARD

Сообщение rezak90 » 04 авг 2013, 21:04

sanu0074 писал(а):p.p.s. Я недавно начал изучать программирование android, до этого догло занимался web-программированием.....
тогда надо было с Java начинать
R.id.team
Политика на форуме запрещена

Ответить