بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

استفاده از AsyncTask در پروژه Notes (حل شد)

مدیریت گفتگو
Alireza_Ghamkhar 11 سال پیش
آخرین تغییر: 10 سال پیش

سلام. میخواستم بدونم اگر بخواهیم از AsyncTask در پروژه Notes استفاده بکنیم دقیقا کجاهای برنامه باید چیکار کنیم.
ممنون میشم کمکم کنید.

نظرات

CodeMaster 11 سال پیش
شما باید کلاس وب سرویس رو با استفاده از Async Task بنویسید که عملیات اتصال به وب سرویس از طریق متد doInBackground انجام بشه اما به نظر من با توجه به ساختار کلی کلاس Async Task تو این پروژه بهتره از Thread استفاده کنید چون استفاده از Async Task مقداری تو این برنامه کارو الکی پیچیده میکنه (هرچند که به نظر من کلا Async Task ازون دست کلاسهایی که باعث میشه مجبور شیم لقمه رو الکی دو سرمون بچرخونیم).
Alireza_Ghamkhar 11 سال پیش
خوب Thread رو کجاش قرار بدم... آخه شنیدم Thread خیلی دردسر داره واسه خودش...
Alireza_Ghamkhar 11 سال پیش
من هنوز متوجه نشدم دقیقا تو کدوم کلاسا باید Async task رو وارد کنم هر چی که فکر میکنم
Hossein Kurd 11 سال پیش
AsyncTast نوعی Thread هست که متد شروع ، پایان و در حین کار داره ؛ بیشتر برای خواندن خروجی وب سرویس کارایی داره و کارهای مشابه
Alireza_Ghamkhar 11 سال پیش
خوب پروژه notes هم خروجی وب سرویس رو میخونه ... خواهشا کسی اگه میتونه کمک کنه کارم گیره...
خواست خدایی 10 سال پیش
سلام من یه سوال فنی دارم تو آموزش ها من آموزش AsyncTask رو ندیدم البته تا بخش 15 تو آموزش ها آموزشش هست عایا؟؟

پاسخ‌ها 5

Alireza_Ghamkhar 11 سال پیش

این یکی از کدها هستش تو پروژه که نمیدونم چجوری با 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);
		
	}

نظرات

javac 11 سال پیش

 کد رو با استفاده از یک 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);

نظرات

Alireza_Ghamkhar 11 سال پیش
ضمن تشکر ویژه از زحمتی که کشیدید. متاسفانه ارور های زیادی خود برنامه میگیره از این وضعیت. اگر تو کامپایلر بزنید متوجه صحبتم میشید.
javac 11 سال پیش
قاعدتا خطایی نباید بده !!! چی میگه ؟حرفش چیه؟ :) خطا رو اینجا بزاز....
Alireza_Ghamkhar 11 سال پیش
به اون return null و return result خیلی گیر میده چرا که میگه Void method can not return a value تازه این بعد از زمانی هستش که یه سری پارامتر ها رو مجبور میکنه فاینال کنیم. حالا من اومدم همین ترد رو روی دستور ReadData() تو Commands اجرا کردم و به سلامتی اومد بالا... فقط فکر میکنم همین کار را برای متد های آپدیت و دیلیت و ... هم بکنم. فقط میمونه اینکه بتونم یه Loading بزارم واسش و چک کنم اگه نت قطعه کلا بیخیال این کارا بشه... مرسی دوست عزیز از وقتی که برام گذاشتی و راهنمایی خوبت که فکر میکنم منو به جواب رسوند...
Alireza_Ghamkhar 11 سال پیش
الان با AsyncTask هم پیاده سازی شد به صورتی که همه چیه متد Read data رو اول به صورت یک متد در آوردم سپس ریختم تو Do in background و تنها یک خط که اونم execute مربوط به Asynctask بود رو در متد Read data قرار دادم و کار کرد فکر کنم دیگه به راحتی بتونم لودینگ اینا هم براش بزارم...
javac 11 سال پیش
اصلاح شد :)
Alireza_Ghamkhar 11 سال پیش
با تشکر ... خیلی خیلی ممنون واقعا
سعید 11 سال پیش
کاش برای readData هم مثال میزدید که چجوری خروجی listener رو به jsonarray باید داد؟چون اون از جنس String میگیره
javac 11 سال پیش
readData چی هست؟! من یادم نیست استاد چی درس دادن! به صورت یک سوال مجزا مطرح کنید به همراه کد
hassan 10 سال پیش
ببخشید اما خروجی این خط string نیست WebService.readUrl( لینک params, listener); چطور بریزمش توی result
javac 10 سال پیش
متوجه سوالتون نشدم! !
ali92 10 سال پیش
سلام امکانش هست دیتایی(در اینجا JSON) که در متد onReceived دریافت می کنیم رو خارج از متد و listener استفاده کنیم . چون من وقتی با استفاده از یک فیلد میخونمش و توی Log چاپش میکنم null بر میگردونه!
javac 10 سال پیش
بله میشه ، وقتی دیتا در متد onReceived دریافت شد بریزیدش داخل یک متغیر سراسری (فیلد)
ali92 10 سال پیش
همین کارو می کنم ولی null بر میگردونه پس از چاپش در Log . اما توی onReceive درست چاپ میشه!
سعید 11 سال پیش

این تابع 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();}
			   
		   }
		   
	}

 

نظرات

javac 11 سال پیش
سوالتون اینه که بعد از پر کردن آرایه چطور به listener پاسش بدیم؟ اگر اینه که در پارامتر ورودی متد onReceived بجای String یک ArrayList بزارید.
محمد آقا 11 سال پیش

کسی از دوستان تونسته این مشکل رو حل کنه ؟

نظرات

Hossein Kurd 11 سال پیش
کدوم مشکل؟ مشکلی نمونده !
hassan 10 سال پیش

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .