آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

سعید  11 سال پیش  11 سال پیش
+1 0

سلام.

من اومدم داخل کلاس وب سرویسم به ترد و لیسنر گذاشتم که وقتی کارش تموم شده result رو داخل اینترفیس OnWebserviceCompleteListener

من این کار رو کردم که بتونم تو اکتیویتی هام لودینگ بذارم.چجوری میتونم این لیسنر رو توی اکتیویتی به کار ببرم و لودینگ بذارم؟

اینترفیسم به این صورته

 public interface OnWebserviceCompleteListener {

public void onDownloadComplete(String result);
}

کلاس وب سرویسم به این صورت هستش

 public class Webservice {

public static void readUrl(final String url, final ArrayList<NameValuePair> params, final OnWebserviceCompleteListener 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.addHeader("Content-Type", "application/x-www-form-urlencoded");
method.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
//method.setEntity(new UrlEncodedFormEntity(params));
Log.i("paramssize", "params is wdsl: " + params.size());
}

HttpResponse response = client.execute(method);

InputStream inputStream = response.getEntity().getContent();
final String result = convertInputStreamToString(inputStream);

if (listener != null) {

G.HANDLER.post(new Runnable() {

@Override
public void run() {
listener.onDownloadComplete(result);
}
});
}
//////return result;
}
catch (ClientProtocolException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}

}
});

thread.start();

}


private static String convertInputStreamToString(InputStream inputStream) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder = new StringBuilder();

String line = "";

while ((line = reader.readLine()) != null) {
builder.append(line);
}

return builder.toString();
}
catch (IOException e) {
e.printStackTrace();
}

return null;
}

}

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

 برای این سوال 10 پاسخ وجود دارد.
پاسخ به سوال 
Hajhosseini  11 سال پیش
+1 0

 public void setOnWebserviceCompleteListener(OnWebserviceCompleteListener listener) {
this.listener = listener; }

رو به کلاس وب سرویست اضافه کن، بعد توی اکتیویتی کد زیر رو بنویس

 WebService webService = new WebService(.......);
webService.setOnWebServiceCompleteListener(new OnWebserviceCompleteListener)

اینو که بزنی خودش بقیش رو مینویسه،

پاسخ به سوال 
سعید  11 سال پیش
0 0

ممنون اینو به اکتیوتی اضاف کردم اما جواب نداد.

         Webservice webservice = new Webservice();
webservice.setOnWebserviceCompleteListener(new OnWebserviceCompleteListener() {

@Override
public void onDownloadComplete(String result) {
Log.i("onDownloadCompleteResult+++", "onDownloadComplete+++");
adapter.notifyDataSetChanged();

}
});
+1 0
کد استفاده از وب سرویست توی اکتیویتی رو کامل قرار بده تا دقیقشو بنویسم برات، باید از همون لیستنری که به وب سرویس ارسال میکنی استفاده کنی (11 سال پیش)
پاسخ به سوال 
سعید  11 سال پیش
0 0

خدمت شما

من میخوا بعد از اتمام کار وب سرویس ادابترم رو ناتیفای سیو چنج کنم

         Webservice webservice = new Webservice();
webservice.setOnWebserviceCompleteListener(new OnWebserviceCompleteListener() {

@Override
public void onDownloadComplete(String result) {
Log.i("onDownloadCompleteResult+++", "onDownloadComplete+++");
adapter.notifyDataSetChanged();

}
});
0 0
readUrl رو کجا call میکنی؟ منظورم اون کده... این کدی که شما گذاشتی هیچ کاری انجام نمیده! (11 سال پیش)
0 0
اونو تو یک کلاس دیگه نوشتم و اون قسمت درست کار میکنه.تو کلاس cmd. اما من میخوام تو اکتیویتیم بتونم اینترفیسو صدا بزنم تا بفهمم کی تموم میشه و ازش استفاده کنم.یعنی هم تو cmd ازش استفاده کنم هم تو اکتیویتی. (11 سال پیش)
پاسخ به سوال 
سعید  11 سال پیش
0 0

کد اکتیویتی

 public class ActivityApplicationsList extends EnhancedActivity {

private ListView list;
public static AdapterApplication adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_applications_list);


list = (ListView) findViewById(R.id.list);
adapter = new AdapterApplication(G.applications);
list.setAdapter(adapter);
Cmd.read(brand, model, ostan, limit);



OnWebserviceCompleteListener listener = new OnWebserviceCompleteListener() {

@Override
public void onDownloadComplete(String result) {
Log.i("onDownloadCompleteResult+++", "onDownloadComplete+++");
adapter.notifyDataSetChanged();

}
};


}

کد کلاس Cmd

public class Cmd {

public static void read(String brand, String model, String ostan, int limit) {
String url = G.URL + "?read=null&brand=" + brand + "&carmodel=" + model + "&ostan=" + ostan + "&limit=" + limit;
//Log.i("UrlRead", "UrlRead is : " + url);
Webservice.readUrl(url, null, new OnWebserviceCompleteListener() {

@Override
public void onDownloadComplete(String result) {
//Log.i("resultREAD", "resultREAD is : " + result);
if (result != null) {
try {
//Log.i("onDownloadCompleteRead", "onDownloadCompleteRead is result : " + result);
G.applications.clear();
JSONArray apps = new JSONArray(result);
// Log.i("appsCount", "appsCount is : " + apps.length());
for (int i = 0; i < apps.length(); i++) {
JSONObject object = apps.getJSONObject(i);
StructApplication application = new StructApplication();

application.id = object.getInt("id");
application.title = object.getString("title");
application.price = object.getString("price");
application.ostan = object.getString("ostan");
application.imgurl = object.getString("imgurl");
application.karkard = object.getString("karkard");
application.color = object.getString("color");
application.incolor = object.getString("incolor");
application.dande = object.getString("dande");
application.fuel = object.getString("fuel");
application.mobile = object.getString("mobile");
application.ts = object.getString("ts");
application.tozihat = object.getString("tozihat");
application.arrayimage = object.getString("arrayimage");

G.applications.add(application);
}
// ActivityApplicationsList.adapter.notifyDataSetChanged();

}
catch (JSONException e) {
e.printStackTrace();
}
}

}
});
}

کد کلاس وب سرویس

package project;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import android.util.Log;


public class Webservice {

public static void readUrl(final String url, final ArrayList<NameValuePair> params, final OnWebserviceCompleteListener 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.addHeader("Content-Type", "application/x-www-form-urlencoded");
method.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
//method.setEntity(new UrlEncodedFormEntity(params));
Log.i("paramssize", "params is wdsl: " + params.size());
}

HttpResponse response = client.execute(method);

InputStream inputStream = response.getEntity().getContent();
final String result = convertInputStreamToString(inputStream);

if (listener != null) {

G.HANDLER.post(new Runnable() {

@Override
public void run() {
listener.onDownloadComplete(result);
}
});
}
//////return result;
}
catch (ClientProtocolException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}

}
});

thread.start();

}


private static String convertInputStreamToString(InputStream inputStream) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder = new StringBuilder();

String line = "";

while ((line = reader.readLine()) != null) {
builder.append(line);
}

return builder.toString();
}
catch (IOException e) {
e.printStackTrace();
}

return null;
}

}

+1 0
مشکل شما خیلی سادست، باید لیستنره توی اکتیویتی رو به Cmd ارسال کنی، بعد اونو پاس بدی به وب سرویس، اینجوری وقتی وب سرویس کارش تموم میشه همون لیستنر رو کال میکنه. (11 سال پیش)
0 0
ممنون چجوری؟ (11 سال پیش)
پاسخ به سوال 
Hajhosseini  11 سال پیش
+2 0

                                                                                                                                        اکتیویتی:
    publicclassActivityApplicationsListextendsEnhancedActivity{

        privateListView                   list;
        publicstaticAdapterApplication   adapter;


        @Override
        protectedvoid onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_applications_list);

            OnWebserviceCompleteListener listener =newOnWebserviceCompleteListener(){                  لیستنر رو بالا تعریف میکنی

                @Override
                publicvoid onDownloadComplete(String result){
                    Log.i("onDownloadCompleteResult+++","onDownloadComplete+++");
                    adapter.notifyDataSetChanged();

                }
            };

            list =(ListView) findViewById(R.id.list);
            adapter =newAdapterApplication(G.applications);
            list.setAdapter(adapter);
            Cmd.read(brand, model, ostan, limit, listener);      لیستنر رو ارسال میکنی به کلاس مورد نظر

        }
                                                                                                                                         توی Cmd:
        publicclassCmd{

            publicstaticvoid read(String brand,String model,String ostan,int limit,OnWebserviceCompleteListener listener){    دریافت لیستنر
                String url = G.URL +"?read=null&brand="+ brand +"&carmodel="+ model +"&ostan="+ ostan +"&limit="+ limit;
//Log.i("UrlRead", "UrlRead is : " + url);
                Webservice.readUrl(url,null, listener{                              ارسال لیستنر به وب سرویس

                    @Override
                    publicvoid onDownloadComplete(String result){
//Log.i("resultREAD", "resultREAD is : " + result);
                        if(result !=null){
                            try{
//Log.i("onDownloadCompleteRead", "onDownloadCompleteRead is result : " + result);
                                G.applications.clear();
                                JSONArray apps =newJSONArray(result);
// Log.i("appsCount", "appsCount is : " + apps.length());
                                for(int i =0; i < apps.length(); i++){
                                    JSONObjectobject= apps.getJSONObject(i);
                                    StructApplication application =newStructApplication();

                                    application.id =object.getInt("id");
                                    application.title =object.getString("title");
                                    application.price =object.getString("price");
                                    application.ostan =object.getString("ostan");
                                    application.imgurl =object.getString("imgurl");
                                    application.karkard =object.getString("karkard");
                                    application.color =object.getString("color");
                                    application.incolor =object.getString("incolor");
                                    application.dande =object.getString("dande");
                                    application.fuel =object.getString("fuel");
                                    application.mobile =object.getString("mobile");
                                    application.ts =object.getString("ts");
                                    application.tozihat =object.getString("tozihat");
                                    application.arrayimage =object.getString("arrayimage");

                                    G.applications.add(application);
                                }
// ActivityApplicationsList.adapter.notifyDataSetChanged();

                            }
                            catch(JSONException e){
                                e.printStackTrace();
                            }
                        }

                    }
                });
            }

برای تمیز تر شدن کد، میتونی لیستنر رو توی خود متدت بسازی:

 Cmd.read(brand, model, ostan, limit, new OnWebserviceCompleteListener ......);
پاسخ به سوال 
سعید  11 سال پیش
0 0

ممنون توی Cmd این قسمتو متوجه نشدم

Webservice.readUrl(url,null, listener{ارساللیستنربهوبسرویس
پاسخ به سوال 
Hajhosseini  11 سال پیش
+1 0

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

پس ما چه کارایی انجام میدیم؟
1: یک object از کلاس Cmd میسازیم (در اینجا چون استاتیک تعریف کردید object ساخته نمیشه و فقط متدش کال میشه)
1.5: یک لیستنر میسازیم و ارسالش میکنیم برای کلاس Cmd
2: کلاس Cmd عملیات رو انجام میده و یک object از کلاس وب سرویس میسازه
2.5: کلاس وب سرویس نیاز به یک لیستنر داره که پس از اتمام عملیات اونو صدا بزنه(که ما باید همون لیستنری که اول ساختیمو براش بفرستیم)
3: کلاس وب سرویس عملیات رو انجام میده و لیستنر رو کال میکنه.

پاسخ به سوال 
سعید  11 سال پیش
0 0

ممنون از شما ببنید

کدی که داخل ان کریت اکتیویتی مینویسم اینه

final OnWebserviceCompleteListener listener = new OnWebserviceCompleteListener() {

@Override
public void onWebserviceCompelete(String result) {
Log.i("CompleteReadData", "result");

}
};
Cmd.read(brand, model, ostan, limit, listener);

کد Cmd اینه

public class Cmd {

public static void read(String brand, String model, String ostan, int limit, OnWebserviceCompleteListener listener) {
String url = G.URL + "?read=null&brand=" + brand + "&carmodel=" + model + "&ostan=" + ostan + "&limit=" + limit;
Log.i("UrlRead", "UrlRead is : " + url);
Webservice.readUrl(url, null, listener);
try {
G.applications.clear();
JSONArray apps = new JSONArray((Collection) listener);
for (int i = 0; i < apps.length(); i++) {
JSONObject object = apps.getJSONObject(i);
StructApplication application = new StructApplication();

application.id = object.getInt("id");
application.title = object.getString("title");
application.price = object.getString("price");
application.ostan = object.getString("ostan");
application.imgurl = object.getString("imgurl");
application.karkard = object.getString("karkard");
application.color = object.getString("color");
application.incolor = object.getString("incolor");
application.dande = object.getString("dande");
application.fuel = object.getString("fuel");
application.mobile = object.getString("mobile");
application.ts = object.getString("ts");
application.tozihat = object.getString("tozihat");
application.arrayimage = object.getString("arrayimage");

G.applications.add(application);
}

}
catch (JSONException e) {
e.printStackTrace();
}
}

کد وب سرویسمم اینه

public class Webservice {
public static void readUrl(final String url, final ArrayList<NameValuePair> params, final OnWebserviceCompleteListener 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.addHeader("Content-Type", "application/x-www-form-urlencoded");
method.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
//method.setEntity(new UrlEncodedFormEntity(params));
Log.i("paramssize", "params is wdsl: " + params.size());
}

HttpResponse response = client.execute(method);

InputStream inputStream = response.getEntity().getContent();
String result = convertInputStreamToString(inputStream);

if (result != null) {
listener.onWebserviceCompelete(result);
}
}
catch (ClientProtocolException e) {
e.printStackTrace();
Log.i("ClientProtocolException", "ClientProtocolException is : " + e);
}
catch (IOException e) {
e.printStackTrace();
Log.i("IOException", "IOException is : " + e);
}
}
});
thread.start();


تو قسمت Cmd جیسون ارری JSONArray به listener گیر میده و به عنوان ورودی قبولش نمیکنه

+1 0
مشکلی نمیبینم، لیستنر رو public و در بالا تعریف کنید (از final خارج بشه) شاید درست شد. بهتره همونجوری که بالا نوشتم، new OnWebserviceCompleteListener.onWebserviceCompelete بزنی (11 سال پیش)
پاسخ به سوال 
سعید  11 سال پیش
+1 0

ببینید الان وقتی من از اکتیویتی listener رو به Cmd میفرستم نیاز دارم یه ورودی به jsonarray بدم.خوب الان این ورودی رو قبول نمیکنه چون یه چیزی از جنس String نیاز داره تا بتونه تجزیش کنه.مکشل من فقط تو این قسمت هستش.

از اینیم که وقتتونو میذارم و پاسخ میدید سپاس گذارم.

پاسخ به سوال 
Hajhosseini  11 سال پیش
0 0

هم کلاس Cmd و هم کلاس وب سرویستون مشکل دارن! شما توی Cmd داری یک Array میگیری، توی کلاس وب سرویس داری یک String میگیری و پاس میدی به لیستنر!!!   

JSONArray apps =newJSONArray((Collection) listener);

کد بالا اصلا مقهومی نداره، شما داری لیستنری که خودت ساختی رو به JSONArray پاس میدی؟!

به نظر من ماژول وب سرویس استاد رو یک بار دیگه نگاه کنید و بعد این قسمت رو بنویسید، روش کار به این صورت هست که شما باید با وب سرویستون اطلاعات رو از وب سرویس بگیرید، و بعد به وسیله Json بیاید اون اطلاعات رو دروی یک ArrayList یا یک متغیر کاستوم (مثلا شما application تعریف کردی) قرار بدی.
برای تمیز تر شدن کار، اصلا هیچی رو توی کلاس G تعریف نکنید، همه آرایه ها و متغیر هارو باید به متد یا کلاس های دیگه ارسال کنید، نه اینکه توی یک متغیر استاتیک تعریف کنید و ازش استفاده کنید، این کار بعدا ممکنه مشکلات خیلی زیادی براتون به وجود بیاره.


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