ضمن تشکر ویژه از زحمتی که کشیدید. متاسفانه ارور های زیادی خود برنامه میگیره از این وضعیت. اگر تو کامپایلر بزنید متوجه صحبتم میشید.
بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ
استفاده از AsyncTask در پروژه Notes (حل شد)
مدیریت گفتگو
آخرین تغییر: 10 سال پیش
سلام. میخواستم بدونم اگر بخواهیم از AsyncTask در پروژه Notes استفاده بکنیم دقیقا کجاهای برنامه باید چیکار کنیم.
ممنون میشم کمکم کنید.
پاسخها 5
این یکی از کدها هستش تو پروژه که نمیدونم چجوری با Async task یا Thread حلش کنم.
کد اولی که برای کلاس Webservice
public static String readUrl(String url,ArrayList params) {
try {
HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost(url);
if(params!=null){
method.setEntity(new UrlEncodedFormEntity(params));
}
HttpResponse response = client.execute(method);
InputStream inputStream = response.getEntity().getContent();
String result = convertInputStreamToString(inputStream);
return result;
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
کلاس دوم هم که Commands هستش...
public static void readData() {
String result = WebService.readUrl("http://***.php?action=read",null);
if(result != null){
try {
G.tasks.clear();
JSONArray tasks = new JSONArray(result); //for(int i = 0 ; i<tasks.length();
for(int i = tasks.length()-1 ; i>=0;i--){
JSONObject object = tasks.getJSONObject(i);
StructTask task = new StructTask();
task.id = object.getLong("task_id");
task.title = object.getString("work_title");
task.desc = object.getString("work_desc");
task.done = object.getInt("work_done") == 1 ?true:false;
G.tasks.add(task);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/* public void sendData(ArrayList params){
WebService.readUrl("***.php",params);
}*/
public static void updateData(ArrayList params){
WebService.readUrl("***.php?",params);
}
public static void removeData(ArrayList params){
WebService.readUrl("***.php?",params);
}
public static void insertData(ArrayList params) {
WebService.readUrl("***.php",params);
}
نظرات
کد رو با استفاده از یک listener اصلاح کردم.
این وب سرویس :
public static interface listener {
public void onReceived(String string);
}
public static void readUrl(final String url, final ArrayList<NameValuePair> params, final listener listener) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient client = new DefaultHttpClient();
HttpPost method = new HttpPost(url);
if (params != null) {
method.setEntity(new UrlEncodedFormEntity(params));
}
HttpResponse response = client.execute(method);
InputStream inputStream = response.getEntity().getContent();
String result = convertInputStreamToString(inputStream);
if (listener != null) {
listener.onReceived(result);
}
}
catch (ClientProtocolException e) {
Log.v("LOG", "readURL1" + e);
}
catch (IOException e) {
Log.i("LOG", "readURL2" + e);
}
}
});
thread.start();
}
اینم جایی هست که وبسرویس رو فراخوانی میکنیم:
WebService.listener listener = new listener() {
@Override
public void onReceived(String data) {
/// do stuff ...
}
};
WebService.readUrl("http://192.168.1.100/note-server/service.php?action=update", params, listener);
نظرات
قاعدتا خطایی نباید بده !!! چی میگه ؟حرفش چیه؟ :) خطا رو اینجا بزاز....
به اون return null و return result خیلی گیر میده چرا که میگه Void method can not return a value تازه این بعد از زمانی هستش که یه سری پارامتر ها رو مجبور میکنه فاینال کنیم. حالا من اومدم همین ترد رو روی دستور ReadData() تو Commands اجرا کردم و به سلامتی اومد بالا... فقط فکر میکنم همین کار را برای متد های آپدیت و دیلیت و ... هم بکنم. فقط میمونه اینکه بتونم یه Loading بزارم واسش و چک کنم اگه نت قطعه کلا بیخیال این کارا بشه... مرسی دوست عزیز از وقتی که برام گذاشتی و راهنمایی خوبت که فکر میکنم منو به جواب رسوند...
الان با AsyncTask هم پیاده سازی شد به صورتی که همه چیه متد Read data رو اول به صورت یک متد در آوردم سپس ریختم تو Do in background و تنها یک خط که اونم execute مربوط به Asynctask بود رو در متد Read data قرار دادم و کار کرد فکر کنم دیگه به راحتی بتونم لودینگ اینا هم براش بزارم...
اصلاح شد :)
با تشکر ... خیلی خیلی ممنون واقعا
کاش برای readData هم مثال میزدید که چجوری خروجی listener رو به jsonarray باید داد؟چون اون از جنس String میگیره
readData چی هست؟! من یادم نیست استاد چی درس دادن! به صورت یک سوال مجزا مطرح کنید به همراه کد
ببخشید اما خروجی این خط string نیست WebService.readUrl( لینک params, listener);
چطور بریزمش توی result
متوجه سوالتون نشدم! !
سلام امکانش هست دیتایی(در اینجا JSON) که در متد onReceived دریافت می کنیم رو خارج از متد و listener استفاده کنیم . چون من وقتی با استفاده از یک فیلد میخونمش و توی Log چاپش میکنم null بر میگردونه!
بله میشه ، وقتی دیتا در متد onReceived دریافت شد بریزیدش داخل یک متغیر سراسری (فیلد)
همین کارو می کنم ولی null بر میگردونه پس از چاپش در Log . اما توی onReceive درست چاپ میشه!
این تابع readdata هستش
publicstaticvoid readData(){String result =WebService.readUrl("http://***.php?action=read",null); if(result !=null){ try{ G.tasks.clear(); JSONArray tasks =newJSONArray(result);//for(int i = 0 ; i<tasks.length(); for(int i = tasks.length()-1; i>=0;i--){ JSONObjectobject = tasks.getJSONObject(i);StructTask task =newStructTask(); task.id =object.getLong("task_id"); task.title =object.getString("work_title"); task.desc =object.getString("work_desc"); task.done=object.getInt("work_done")==1?true:false; G.tasks.add(task);}}catch(JSONException e){// TODO Auto-generated catch block e.printStackTrace();} } }
نظرات
سوالتون اینه که بعد از پر کردن آرایه چطور به listener پاسش بدیم؟ اگر اینه که در پارامتر ورودی متد onReceived بجای String یک ArrayList بزارید.
کسی از دوستان تونسته این مشکل رو حل کنه ؟
نظرات
کدوم مشکل؟ مشکلی نمونده !
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
ویرایش
پیام
نظرات