ورود

View Full Version : دوتا مشکل ، دوتا سوال



hosseinaryai
جمعه 16 خرداد 1393, 22:00 عصر
راستش دو دل بودم این سوالو بپرسم یا نه ..
یکم گشتم چیزی پیدا نکردم بدردم بخوره گفتم بادا باد می پرسم دیگه :بامزه:

خب سوال اینه :
من توی برنامه ام از کلاسی که extends شده از AsyncTask برای ارتباط با php استفاده کردم .. خب برای بار اول خوبه مشکلی نیست .. اما وقتی من توی برنامه ام یه دکمه ای دارم که کاربر بزنه روش و دوباره اطلاعاتو از سرور بخونه جواب نمیده .. البته نه که نده .. یکی در میون جواب میده .. یه جایی خوندم خاصیت AsyncTask اینه که یکبار اجرا بشه .. اینو دقیق نفهمیدم .. الان مشکل من مربوط به این خاصیت میشه ؟
و سوال دوم اینکه من با کدهای زیر وسط میشم به سرور و یکسری عکسو از سرور توی ایمیج باکش نشون میده و همزمان توی یک فایلی ذخیره می کنه .. عکس ها به دو صورت با کیفیت و بی کیفیت هستن .. بی کیفیتا رو میگیره و مشکلی نیست اما با کیفیت ها رو فورس کلوز می کنه .. توی اکلیپس می نویسه ارور فضا و جای خالی و اینا اما سر و ته عکسا همش 20 مگایایت و گوشی طرفای 3 گیگ فضای خالی داره .. مشکل از کجاست ؟


public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
ImageView bmImage;
String pathsave;
String nameimahe;
boolean saveimg;
Context c;
public DownloadImageTask(ImageView bmImage,
String pathsave,
String nameimahe,
boolean saveimg,
Context c) {
this.bmImage = bmImage;
this.pathsave = pathsave;
this.nameimahe = nameimahe;
this.saveimg = saveimg;
}

@SuppressLint({ "ParserError", "ShowToast"})
protected Bitmap doInBackground(String... urls) {
String urldisplay = urls[0];
Bitmap mIcon11 = null;
/*StatFs stat = new StatFs(Environment.getExternalStorageDirectory().g etPath());
double sdAvailSize = (double)stat.getAvailableBlocks()
* (double)stat.getBlockSize();
double gigaAvailable = sdAvailSize / 1073741824;

if(gigaAvailable < 3){
Toast.makeText(c.getApplicationContext(), "به علت نداشتن فضای خالی ، عکس ها قادر به بارگذاری شدن نیستند", 5000).show();
}else{*/
try {
InputStream in = new java.net.URL(urldisplay).openStream();
mIcon11 = BitmapFactory.decodeStream(in);

if(saveimg){
OutputStream outStream = null;
File file = new File(pathsave, nameimahe + ".JPEG");
try {
outStream = new FileOutputStream(file);
mIcon11.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
}
catch(Exception e){}
}else{}

} catch (Exception e) {
//Log.e("Error", e.getMessage());
//e.printStackTrace();
}
//}


return mIcon11;

}

protected void onPostExecute(Bitmap result) {
bmImage.setImageBitmap(result);
}

}

poorman
جمعه 16 خرداد 1393, 22:44 عصر
سلام

اول بذارید تشکر کنم از عنوان بسیار با محتوا و با مفهوم تاپیک !!!

سوال اولتون رو نمیدونم

ولی سوال دومتون، مربوط میشه به خطای Out of Memory

به این معنی نیست که حافظه کم دارید، به این معنی هست که به دلیل کیفیت بالای عکسها، ظریفیت رم اختصاص داده شده به برنامتون پر شده

این ظرفیت برای هر برنامه محدود هست و معمولا بین 32 تا 256 مگابایت هست

وقتی برنامه بخواد یک عکس با اندازه بالا و کیفیت بالا رو باز کنه اگر رم اختصاص داده شده به برنامه پایین باشه، برنامه فورس کلوز میده

شما ابتدا باید حجم و کیفیت عکس رو برای باز شدن توی برنامه بیارید پایین، و بعدش هم مدیریت حافظه کنید

واسه خطای out of memory حوصله دارید این تاپیک رو بخونید شاید مفید واقع بشه

http://barnamenevis.org/showthread.php?440701-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AD%D9%84-%D8%AE%D8%B7%D8%A7%DB%8C-Out-of-Memory-%D9%88-Force-Close-%D9%87%D9%86%DA%AF%D8%A7%D9%85-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%B9%DA%A9%D8%B3-%D9%87%D8%A7-(Bitmap)&p=1972033&viewfull=1#post1972033

smemamian
جمعه 16 خرداد 1393, 23:45 عصر
سلام
جواب سوال اول:

به طور کلی باید از هر شیء که از AsyncTask می گیرید، یک بار اجرا شود.

hosseinaryai
شنبه 17 خرداد 1393, 02:00 صبح
سلام

اول بذارید تشکر کنم از عنوان بسیار با محتوا و با مفهوم تاپیک !!!

سوال اولتون رو نمیدونم

ولی سوال دومتون، مربوط میشه به خطای Out of Memory

به این معنی نیست که حافظه کم دارید، به این معنی هست که به دلیل کیفیت بالای عکسها، ظریفیت رم اختصاص داده شده به برنامتون پر شده

این ظرفیت برای هر برنامه محدود هست و معمولا بین 32 تا 256 مگابایت هست

وقتی برنامه بخواد یک عکس با اندازه بالا و کیفیت بالا رو باز کنه اگر رم اختصاص داده شده به برنامه پایین باشه، برنامه فورس کلوز میده

شما ابتدا باید حجم و کیفیت عکس رو برای باز شدن توی برنامه بیارید پایین، و بعدش هم مدیریت حافظه کنید

واسه خطای out of memory حوصله دارید این تاپیک رو بخونید شاید مفید واقع بشه

http://barnamenevis.org/showthread.php?440701-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AD%D9%84-%D8%AE%D8%B7%D8%A7%DB%8C-Out-of-Memory-%D9%88-Force-Close-%D9%87%D9%86%DA%AF%D8%A7%D9%85-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D8%B9%DA%A9%D8%B3-%D9%87%D8%A7-(Bitmap)&p=1972033&viewfull=1#post1972033

سلام
اول بسیار ممنون بابت تشکری که از عنوان تاپیک کردی :لبخند:
چشم .. سعی می کنم دفعه ی بعد عنوان درست و مستقیمی پیدا کنم :خجالت:

و ممنونم بابت راهنمایی که کردی .. حتمن اون تاپیکو می خونم

hosseinaryai
شنبه 17 خرداد 1393, 02:02 صبح
سلام
جواب سوال اول:

به طور کلی باید از هر شیء که از AsyncTask می گیرید، یک بار اجرا شود.

سلام
ممنون بابت جوابت .. تا اینجاشو متوجه شدم اماچطور می تونم وقتی روی دکمه ی رفرش می زنم دوباره اطلاعاتو از سرور بگیره ؟

smemamian
شنبه 17 خرداد 1393, 21:25 عصر
سلام
ممنون بابت جوابت .. تا اینجاشو متوجه شدم اماچطور می تونم وقتی روی دکمه ی رفرش می زنم دوباره اطلاعاتو از سرور بگیره ؟

2 راه دارید:

1- شرطی بنویسید تا وقتی تابع onPostExecute به پایان نرسید، کاربر نتواند Refresh کند.

2- استفاده از IntentService هست. یکی از مزیت هایی که IntentService نسبت به AsyncTask داره
این هست که درخواست ها رو در صف خود می برد و تا یکی به پایان نرسید، بعدی رو اجرا نمی کند.

hosseinaryai
شنبه 17 خرداد 1393, 22:41 عصر
2 راه دارید:

1- شرطی بنویسید تا وقتی تابع onPostExecute به پایان نرسید، کاربر نتواند Refresh کند.

2- استفاده از IntentService هست. یکی از مزیت هایی که IntentService نسبت به AsyncTask داره
این هست که درخواست ها رو در صف خود می برد و تا یکی به پایان نرسید، بعدی رو اجرا نمی کند.

اوممم .. خب من منظورتو درست متوجه شدم .. یعنی اگه تابع onPostExecute کارش تموم بشه کاربر دوباره می تونه روی دکمه رفرش کلیک کنه .. پس به همین خاطره یکی در میان جواب میده ..
اوکی .. ممنونم .. کمک بزرگی کردی