ورود

View Full Version : مشکل: return در دفعه اول برابر null اما دفعه بعد پر میشه چرا؟



dalmif
شنبه 02 خرداد 1394, 15:48 عصر
سلام دوستان.
یه کدی به شکل زیر نوشتم:


public static Bitmap getimageURL (final String urli) {


Thread m = new Thread() {
@Override
public void run() {
super.run();

try {
URL url = new URL(urli);
//try this url = "http://0.tqn.com/d/webclipart/1/0/5/l/4/floral-icon-5.jpg"
HttpGet httpRequest = null;


httpRequest = new HttpGet(url.toURI());
Log.i("imageSwitcherURL", "s: " + url);
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient
.execute(httpRequest);


HttpEntity entity = response.getEntity();
BufferedHttpEntity b_entity = new BufferedHttpEntity(entity);
InputStream input = b_entity.getContent();


bitmap = BitmapFactory.decodeStream(input);
Log.i("imageSwitcherbitmap", "s: " + bitmap);




} catch (Exception ex) {


} finally {


}
}
};
m.start();

return bitmap;
}

دفعه اول که میام توی صفحه خالی return میشه اما وقتی عقب میزنم و برای بار دوم میام توی اکتیویتی درست میاره
مشکل چیه؟؟
اینم بگم که Birmap bitmap; هم در بالا همه کد ها نوشتم.

JYasProgramer
شنبه 02 خرداد 1394, 16:14 عصر
به نظرم ترد رو در خارج از تابعت ابتدا ران کن یا استارت کن و تا ترد تصویر رو ال به دست بیاره و سپس تابع رو برای گرفتن تصویر فراخونی کن
کدی که ابتدا ترد رو آماده سازی میکنه و بعد ران میکنه و بلافاصله خارج میشه و برای بار دوم که وارد میشی ترد ران شده تصویر گرفته شده رو به شما تحویل میده
پس من میگم اول ترد رو در جای دیگه مثلا در اسینک تسک ران کن تا بتونه تصویر رو به دست بیاره و بعد اونو با فراخونی تابع مورد نظر بدست بیار

dalmif
شنبه 02 خرداد 1394, 18:07 عصر
خیلی ممنون
فقط اگه میشه یه نمونه کد بدید.
من متوجه شدم اما نمیدونم چجوری پیاده سازی کنم.

#root#
شنبه 02 خرداد 1394, 19:08 عصر
ضمن تایید صحبت های دوستمون،
اگر خیلی نمیخوایید خسته بشید :لبخند: ImageView تون رو به متد پاس بدید،
بعد داخل Thread بعد از اینکه Bitmap آماده شد، بدینش به ImageView.

public static Bitmap getimageURL (final String urli, final ImageView iv) {


Thread m = new Thread() {
@Override
public void run() {
super.run();

try {
URL url = new URL(urli);
//try this url = "http://0.tqn.com/d/webclipart/1/0/5/l/4/floral-icon-5.jpg"
HttpGet httpRequest = null;


httpRequest = new HttpGet(url.toURI());
Log.i("imageSwitcherURL", "s: " + url);
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient
.execute(httpRequest);


HttpEntity entity = response.getEntity();
BufferedHttpEntity b_entity = new BufferedHttpEntity(entity);
InputStream input = b_entity.getContent();


bitmap = BitmapFactory.decodeStream(input);
Log.i("imageSwitcherbitmap", "s: " + bitmap);

iv.post(new Runnable() {

@Override
public void run() {
iv.setImageBitmap(bitmap);
}
});




} catch (Exception ex) {


} finally {


}
}
};
m.start();

return bitmap;
}

Bitmap رو هم داخل همین متد تعریف کنید بهتره. (البته شاید دلیل موجهی برای کارتون دارید).

مثال دیگر با Async (http://stackoverflow.com/a/15116180/3678849)

موفق باشید

dalmif
شنبه 02 خرداد 1394, 19:22 عصر
سلام خیلی خیلی ممنون
نه من Bitmap رو وقتی توی متد میذارم و می خوام ریترن کنم میگه که باید final باشه و چون این bitmap قراره بره برای return میگه نباید الی باشه بعد که null میزارم وقتی می خواد bitmap رو توی ترد مقدار گذاری کنه میگه نباید final باشه.
باید کجا بزارم تا این مشکل رو نداشته باشه؟

#root#
شنبه 02 خرداد 1394, 19:42 عصر
یه نکته ای یادم رفت با تغییری که الان دادم نیازی نیست متد Bitmap رو برگردونه، return رو حذف کنید و تو تعریف متد بجای Bitmap بنویسید void.

الان همونجایی که مقدار دهی میشه همونجا تعریف کنیدش، نباید مشکلی باشه.

tux-world
شنبه 02 خرداد 1394, 21:54 عصر
بهتر بود از Picasso استفاده میکردید این مورد رو. پرفورمنسش خیلی بهتر از کدی هستش که نوشتید