محاسبه اندازه size جی سان دریافت شده
سلام میخواستم برای اینکه بتونم پروگرس بار درست کنم برای نمایش اطلاعات از وب به صورت جی سان اندازه جی سان رو بگیرم اومدم و این کد رو زدم توسط این کد ولی متاسفانه هربار به حجم method من اضافه میشه با هربار فراخوانی متد read استاد وقتی که مقدار method.getEntity.length رو تریس میکنم انگار که حجم فایلهای دریافتی با سایز قبلی جمع میشه من کدم رو هم به نظرم درسته نمیدونم واقعا چشه کدی که برای گرفتن سایز ازش استفاده کردم اینه :
در این جا شاید لازمه که بگم همه این کارارو میخوام بکنم چون طبق پست قبلی که زدم سرعت اپلیکیشنم پایین میاد بعد یکی دوتا صدا زدن تابع read و برنامه رو دوستان پیشنهاد کردن که بیام و با اینترفیس و پروگرس هربار بخونم اطلاعاتو و لودینک واسش بزارم ولی خداوکیلی پدر منو در آورده این بار !
HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost(url);
G.jsonSize = 0;
if (params != null) {
method.setEntity(new UrlEncodedFormEntity(params));
G.jsonSize = (int) method.getEntity().getContentLength() *1024;
Log.i(G.LOG_TAG, "سایز ورودی: " + G.jsonSize);
}
//int size = method.getEntity().getContentLength();
HttpResponse response = client.execute(method);
// G.jsonSize = (int) response.getEntity().getContentLength();
// Log.i(G.LOG_TAG, "sag 2: " + G.jsonSize);
InputStream inputStream = response.getEntity().getContent();
String result = convertInputStreamToString(inputStream);
return result;
بچه ها من این کد رو زدم و تاحالاش درست بوده فقط مقدار کل داده json رو میخوام که بگیرم تا بتونم توی onprogres که نوشتم تقسیم کنم به مقدار داتلود شده ... مقدار دانلود شده رو با DownloadedSize کرفتم ولی یکی بکه چجور مقدار کل دریافتی جی سان رو بگیرم //////////////اینم کد :
while ((line = reader.readLine()) != null) {
downloadedSize += line.length();
builder.append(line);
if (Listener != null)
{
final int finaldownloadedSize = downloadedSize;
G.handler.post(new Runnable() {
@Override
public void run() {
Listener.onProgressDownload(finaldownloadedSize);
}
});
}
شما طبق این مبحث عمل کن و کدها رو توی doInbackground قرار بده
فقط توی onPre و onPost می تونی با UI و کلیه TextView ها و ... کار کنی
کار خاصی نداره دو بار که انجام بدی عادت می کنی به AsyncTask
اما دیگه نیاز نیست handler استفاده کنی، کد handler رو پاک کن و فقط وظایش رو توی شرط if بذار چون AsyncTask اتوماتیک این کار رو انجام می ده
Hossein.Kurd عزیز من async رو پیاده سازی کردم فقط مسله اینه که پروگرس بار توی اسینگ فقط اسم اکتیویتی فعلی رو میگیره و من فقط متاسفاته از توی خود کلاس ActivityMain بهش دسترسی دارم ... مثلا یکی از مشکلاتی که دارم اینه که میخوام از توی adapter note هم آپدیتش کنم و نمیشه ...مسله دومم اینه که وقتی اسکرول میشه یک لیست دیگه دفعه بعدم همونجا مونده و نمیاد سر اسکرول .. موندم چکار کنم کد هر بخشو میزارم ببین چه روشی برم بهتره :
کد قسمت اکتیویتی ActivityMain
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
ProgressDialog dialog = new ProgressDialog(ActivityMain.this);
@Override
protected void onPreExecute() {
//set message of the dialog
ListView lstContent = (ListView) findViewById(R.id.LstContent);
G.adapter = new AdapterNote(G.notes);
lstContent.setAdapter(G.adapter);
dialog.setMessage("درحال بارگزاری");
//show dialog
dialog.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... arg0) {
params.add(new BasicNameValuePair("user_id", G.cellcode));
Commands.read(params, prgListener);
return null;
}
protected void onPostExecute(Void result) {
// do UI work here
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
if (G.getJsonString != null) {
try {
G.notes.clear();
JSONArray jsonnews = new JSONArray(G.getJsonString);
for (int i = 0; i < jsonnews.length(); i++) {
JSONObject object = jsonnews.getJSONObject(i);
StructNews note = new StructNews();
note.id = object.getInt("news_id");
note.pagenumber = object.getInt("page_number");
note.Title = object.getString("news_title");
note.description = object.getString("news_desc");
note.isfav = object.getInt("is_fav");
Log.i(G.LOG_TAG, "sss " + object.getString("news_title"));
G.notes.add(note);
}
G.adapter.notifyDataSetChanged();
}
catch (JSONException e) {
e.printStackTrace();
}
}
}
}
};
task.execute((Void[]) null);
واسه ProgressBar :
dialog.show(ActivityMain.myActivity , "Title" , "Loading Please Wait" , true);
dialog.setCancaledOnTouchOutSide(false);
متغیر myActivity هم مثل G.currentActivity از نوع Activity هست ولی انحصارا برای ActivityMain ایجاد می شه ، شما می تونید حتی اون رو به Async تزریق کنید
برای اینکه شما فقط در صورت Lazy Loadin به اطلاعات رو Load کنید می تونید تعیین کنید هر وقت لیست ویو یه آخرین مقدار رسید (نمایش آخرین Item در ListView) از طریق Async اطلاعات رو فراخوانی کنید و "اضافه" کنید(آرایه رو پاک نکنید و اطلاعات رو اضافه کنید)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .