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

اشکال در استفاده از ماژول وب سرویس و استفاده از کتابخانه volley 

مدیریت گفتگو
SaeiD-as 11 سال پیش
آخرین تغییر: 9 سال پیش

سلام دوستان

من در برنامه ام برای قسمت ورود کاربران از کلاس WebService استاد استفاده میکردم و پس از در یافت اطلاعات دیالوگی حاوی اطلاعات کاربر نشون میدادم و بدون هیچ مشکلی برنامه ام اجرا میشد :

 String result = Webservice.readUrl("http://192.168.56.1/negah?action=login", params);
if (result.getBytes().length > 0) {
try {
Log.i("LOG", "result in Login: " + result);
G.users.clear();
JSONArray userj = new JSONArray(result);
JSONObject object = userj.getJSONObject(0);
Log.i("LOG", "object : " + object);
StructUsers user = new StructUsers();

ActivityLogin.recieved_id = object.getLong("user_id");
ActivityLogin.recieved_name = object.getString("user_name");
ActivityLogin.recieved_phone = object.getString("user_phone");
ActivityLogin.recieved_pass = object.getString("user_pass");
ActivityLogin.recieved_address = object.getString("user_address");

G.users.add(user);

AddPreferences.addPreferences();
/*
* show recieved in Dialog
*/
final Dialog dialog = new Dialog(G.currentActivity);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_wellcome);
TextView txtNameRecieved = (TextView) dialog.findViewById(R.id.txtNameRecieved);
TextView txtPhoneRecieved = (TextView) dialog.findViewById(R.id.txtPhoneRecieved);
TextView txtAddressRecieved = (TextView) dialog.findViewById(R.id.txtAddressRecieved);

txtNameRecieved.setText(G.preferences.getString("RECIEVED_NAME", "Name"));
txtPhoneRecieved.setText(G.preferences.getString("RECIEVED_PHONE", "Phone"));
txtAddressRecieved.setText(G.preferences.getString("RECIEVED_ADDRESS", "Address"));

Button btnWellCome = (Button) dialog.findViewById(R.id.btnWellCome);
btnWellCome.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
Intent intent = new Intent(G.currentActivity, ActivityHome.class);
G.currentActivity.startActivity(intent);
G.currentActivity.finish();
}
});
//dialog.setCanceledOnTouchOutside(true);
dialog.show();
}
catch (JSONException e) {
e.printStackTrace();
}

حالا از کلاس ماژول وب سرویس استفاده کردم و برنامه ام رو بصورت زیر تغییر داده ام:

 ModuleWebservice module = new ModuleWebservice();
ModuleWebservice.Listener listener = new ModuleWebservice.Listener() {

@Override
public void onDataReceive(String data) {
if (data.getBytes().length > 0) {
try {
G.users.clear();
JSONArray j_user = new JSONArray(data);
JSONObject object = j_user.getJSONObject(0);
StructUsers user = new StructUsers();
ActivityLogin.recieved_id = object.getLong("user_id");
ActivityLogin.recieved_name = object.getString("user_name");
ActivityLogin.recieved_phone = object.getString("user_phone");
ActivityLogin.recieved_pass = object.getString("user_pass");
ActivityLogin.recieved_address = object.getString("user_address");

G.users.add(user);
Log.i("LOG", " your information recieved ");
AddPreferences.addPreferences();
/*
* show recieved in Dialog
*/
final Dialog dialog = new Dialog(G.currentActivity);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_wellcome);
TextView txtNameRecieved = (TextView) dialog.findViewById(R.id.txtNameRecieved);
TextView txtPhoneRecieved = (TextView) dialog.findViewById(R.id.txtPhoneRecieved);
TextView txtAddressRecieved = (TextView) dialog.findViewById(R.id.txtAddressRecieved);

txtNameRecieved.setText(G.preferences.getString("RECIEVED_NAME", "Name"));
txtPhoneRecieved.setText(G.preferences.getString("RECIEVED_PHONE", "Phone"));
txtAddressRecieved.setText(G.preferences.getString("RECIEVED_ADDRESS", "Address"));

Button btnWellCome = (Button) dialog.findViewById(R.id.btnWellCome);
btnWellCome.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent(G.currentActivity, ActivityHome.class);
G.currentActivity.startActivity(intent);
G.currentActivity.finish();
}
});
//dialog.setCanceledOnTouchOutside(true);
dialog.show();
}
catch (JSONException e) {
e.printStackTrace();
}
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user_phone", edtPhoneLogin.getText().toString()));
params.add(new BasicNameValuePair("user_pass", edtPassLogin.getText().toString()));
module.url("http://192.168.56.1/negah?action=login")
.inputArguments(params)
.listener(listener)
.cacheDir(G.DIR_CACHE)
.enableCache(true)
.cacheExpireTime(30)
.connectionTimeout(3000)
.socketTimeout(5000)
.read();

مشکلی که دارم پس از دریافت اطلاعات دیالوگ نشون داده نمیشه! و خیلی از تغییراتی که در متد onDataReceive دادم هم اعمال نمیشه! همین مشکلو جاهای دیگه برنامه ام هم دارم، ممنون میشم راهنمایی کنید

نظرات

شهریار توکلی 11 سال پیش
ماژول یه سری باگ داره.کسی هم برای کامل کردنش تلاش نمیکنه نمیدونم چرا.من از کلاس G فراخوانی میکنم اطلاعات دریافت میشه ولی بعضی اوقات برنامه رو اجرا میکنی لیست خالی نمایش داده میشه .اگه از داخل خود اکتیویتی هم اجرا کنی اول لیست پر میشه بعد اطلاعات دریافت میشه که باعث میشه لیست خالی بمونه.کش وب سرویس هم نمیدونم چرا کار نمیکنه اطلاعات بر روی یک فایل ذخیره میشه ولی وقتی میگی از کش بخون چیزی خونده نمیشه نمیدونم چرا ؟ اگه این مشکلات رو حل کردی به منم کمک کن.در حال حاضر بهترین راه استفاده از Volley و Asynktask هستش البته اگه اگه وب سرویس اولی که استاد معرفی کرده هم ترد بندی بشه خوبه.
SaeiD-as 11 سال پیش
فک کنم بهترین راهش استفاده از لایبری ها است، طریقه استفاده از لایبری volley رو میتونی یه توضیح مختصر بدی؟ خیلی گشتم اما درست متوجه نشدم!

پاسخ‌ها 9

شهریار توکلی 11 سال پیش

اول کتابخانه ی volley رو دانلود میکنی و به پروژه اضافه میکنی و به این صورت جیسون رو دریافت میکنی فقط نمیدونم چی جوری باید با volley پارامتر ارسال کنم به سرور.این هم متوجه شدی زیر همین پست قرار بده تا بقیه استفاده کنن.

   public void requestData(String uri) {
StringRequest request = new StringRequest(Method.POST, uri,
new Response.Listener<String>() {

@Override
public void onResponse(String response) {




try {

apps.clear();
JSONArray apssp= new JSONArray(response);
for (int i = 0; i < app.length(); i++) {
JSONObject object = app.getJSONObject(i);
StructApps app= new StructApps();
app.id = object.getLong("app_id");
app.name = object.getString("app_name");
app.ratingValue = (float) object.getDouble("app_rating");
app.logoUrl = object.getString("app_logourl");
app.votes = object.getString("app_vote");


apps.add(app);



}
if (adapter != null) {

adapter.notifyDataSetChanged();
}
//part++;
//list.setIsLoading(false);
;
mProgressDialog.dismiss();
}

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

},

new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError ex) {
mProgressDialog.dismiss();
}

});

RequestQueue queue = Volley.newRequestQueue(this);
queue.add(request);
}

نظرات

SaeiD-as 11 سال پیش
مرسی رفیق، با این لایبری میتونیم مدت زمان استفاده از کش وب سرویس و یا connectionTimeOut یا socketTimeOut و ... رو هم تعریف کنیم؟
شهریار توکلی 11 سال پیش
تا اینجایی که در مورد این لایبرری تحقیق کردم اطلاعات رو کش میکنه.حالا تو استک در موردش یه جستجو انجام بده.
SaeiD-as 11 سال پیش

پس از پرس و جوی بسیار تصمیم گرفتم از کتابخانه volley برای اتصال به وب استفاده کنم

لینک دانلود کتابخانه volley

طریقه استفاده از این کتابخانه رو @ shahryarjb در بالا گفتند، طریقه ارسال پارامتر رو در زیر قرار دادم:

استاد برای فرستادن پارامتر همواره از این کدها استفاده میکنند:

 ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(" ", " ")));

این کتابخانه برای ارسال پارامتر از HashMap استفاده میکند، پس بجای کدهای بالا از کدهای زیر استفاده می کنیم:

 Map<String, String> params = new HashMap<String, String>();
params.put(" ", " ");

برای ارسال پارامتر توسط این کتابخانه کد های زیر رو میتونید استفاده کنید:

 String url = "your site";
StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {

@Override
public void onResponse(String response) {
پس از دریافت اطلاعات کدهای این قسمت اجرا می شود
}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError ex) {
در صورت دریافت نکردن اطلاعات کدهای این قسمت اجرا میشود
}
}) {
 Map<String, String> params = new HashMap<String, String>();

@Override
protected Map<String, String> getParams() {
params.put(" ", " "); ارسال پارامترها
return params;
}


@Override
public Map<String, String> getHeaders() throws AuthFailureError {
params.put(" ", " "); ارسال پارامترها
return params;
}
};
RequestQueue queue = Volley.newRequestQueue(G.currentActivity);
queue.add(request);

توضیحات بیشتر و دریافت سمپل: لینک 

موفق باشید

نظرات

SaeiD-as 11 سال پیش
@محمد آقا ، خواهش میکنم، انجام وظیفه است :)
konda 10 سال پیش
سلام، اون دوتا ارسال پارمتر داره، تفاوتش getHeaders() throws AuthFailureError گذاشته چه فرقی باهم دارند؟
nasiri 9 سال پیش
سلام. من با این روش عکسهام رو آپلود میکنم. با موفقیت به سرور میره. ولی همش این متد اجرا میشه @Override public void onErrorResponse(VolleyError ex) { در صورت دریافت نکردن اطلاعات کدهای این قسمت اجرا میشود }
شهریار توکلی 11 سال پیش

این قسمت چه کاری انجام میده ؟ پارامتری که در بالا ارسال میکنیم باید در این کد هم ارسال کنیم ؟

@Override
publicMap<String,String> getHeaders()throwsAuthFailureError{
params.put(" "," ");ارسالپارامترها
returnparams;
}

نظرات

SaeiD-as 11 سال پیش
خودمم دقیق متوجه نشدم! برای محکم کاری این قسمت هم پارامترهامو میفرستم! البته حذفش هم کردم زیاد فرقی نداشت
Hossein Kurd 11 سال پیش

از Volley زیاد خوشم نمی آد، باهاش کار کردم اما دلچسب نبود

ببین دوست عزیز، در مورد کلاس G خیلی بحث شده. بهتره شما یک کلاس رو توس کلاس دیگه public static معرفی نکنی چون موقع Long Time Minimize نرم افزار Crash می ده، وقتی هم Log می گیری متوجه می شی یه G.user خطای nullPointerException می ده

کلاس هاتو دسته بندی کن

مثلا من کلاس :

UIHelpers

ExceptonHelpers

ActivityHelpers

و ...

دارم، هیچ ربطی که به کلاس G نداره

به جای اسم G از App استفاده می کنم و extends Aplication هم نیست و ...

نظرات

SaeiD-as 11 سال پیش
شما چه کتابخانه ای روپیشنهاد میدید؟ لطفا توضیح مختصری هم در موردش بدید تا دوستان هم استفاده کنند
شهریار توکلی 11 سال پیش
مرسی حسین.شما از ماژول استاد استفاده میکنی یا AsynkTask ؟ ماژول رو اگه از خود اکتیوتی اجرا کنی جوابی نمیگیری .دیده بودم تو یکی از پست ها خودتم جواب داده بودی.فکر کنم شما از AsynkTask میکنی .اگه استفاده میکنی چی جوری میشه اطلاعاتو Cash کرد و کتابخانه ی volly رو واسه چی قبول ندارین خیلی ها پیشنهاد میکنن .
Hossein Kurd 11 سال پیش
@SaeiD-as لطفا AsyncTask رو سرچ کن @shahryarjb من از AsyncTask استفاده می کنم، من با volly زیاد کار نکردم اما می دونم چیزی که خودم ایجاد و استفاده می کنم بهینه تره و انعطاف پذیری بیشتری داره برای کش اطلاعات هم آرایه ایجاد می کنم و می ریزم توی DataBase . چون معمولا Lazy Loading دارم نمی تونم مث آموزش سایت توی فایل کش کنم
118674 10 سال پیش
به نظرتون چیکار کنیم بلاخره؟ از کتابخانه volly استفاده کنیم تو پروژه یا وب سرویس دستی ؟ کسی میدونه نظر استاد در این مورد چی هست؟
118674 10 سال پیش

به نظرتون چیکار کنیم بلاخره؟ از کتابخانه volly استفاده کنیم تو پروژه یا وب سرویس دستی ؟ کسی میدونه نظر استاد در این مورد چی هست؟

نظرات

mehdi 10 سال پیش

سلام دوستان کسی میدونه چطور میشه پارامتر ها رو به این صورت به Volley ارسال کنیم

مثلا کد Volley رو در یک کلاس دیگه قرار بدیم و با این دستور بهش URL و پارامتر بدیم.

String result =Webservice.readUrl("http://192.168.56.1/note/index.php",params);

نظرات

SaeiD-as 10 سال پیش
کار سختی نیست، کافیه کدهای ارتباط با سرور volley رو داخل کلاس دیگه ای قرار بدید و مقادیر ورودی رو براش String و HashMap تعیین کنید. و هر جایی که خواستید اون رو فراخوانی کنید آدرس سایتتون و پارامترها رو ارسال کنید
mehdi 10 سال پیش
اگر ممکنه نمونه کد بزارید.
SaeiD-as 10 سال پیش
نمونه کد رو در زیر قرار دادم؛ موفق باشید
SaeiD-as 10 سال پیش

من کد رو به این صورت خودم استفاده میکنم: url اصلی رو داخل کلاس G معرفی کرده ام و به این شکل استفاده می کنم:

داخل کلاس G:

 public static String URL = "http://yourSite.com/";

داخل یه کلاس دیگه مانند populateToNetwork کدهای ارسال به سایتتون رو میفرستید:

در اینجا من readFromNetwork رو نوشتم و شما با توجه به نوع درخواستتون و پاسخی که قراره از web بگیرید کدهای insert و update و ... رو هم میتونید بنویسید:

    public class populateToNetwork {
public static void readFromNetwork(String url, HashMap params){ StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { if (response != null) { G.Note.clear(); try { JSONArray jsonArry = new JSONArray(response); for (int i = 0; i < jsonArry.length(); i++) { JSONObject object = jsonArry.getJSONObject(i); StructNote note = new StructNote(); note.id = object.getLong("id"); note.name = object.getString("name");
note.img = object.getString("img");
G.Note.add(note); } } catch (JSONException e) { e.printStackTrace(); } } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError ex) {} }) { @Override protected Map<String, String> getParams() { return params; } @Override public Map<String, String> getHeaders() throws AuthFailureError { return params; } }; RequestQueue queue = Volley.newRequestQueue(G.currentActivity); queue.add(request); }
}

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

 readFromNetwork(G.URL + "action=read/", params);

چون برای هر url که میفرستید action فرق میکنه اونو هم ارسال میکنید، در مورد params هم در بالا توضیح داده شده

موفق باشید

نظرات

mehdi 10 سال پیش
سلام دوست عزیز خیلی ممنون بابت کمکتون و اگر ممکنه قسمت params رو هم بزارید واقعا خیلی به این کد نیاز دارم . متشکرم .
mehdi 10 سال پیش
سلام دوست عزیز خیلی ممنون بابت کمکتون و اگر ممکنه قسمت params رو هم بزارید واقعا خیلی به این کد نیاز دارم . متشکرم .
mehdi 10 سال پیش
اگر سورس کد هم بزارید که خیلی خوب میشه.
mehdi 10 سال پیش
سلام دوست عزیز این کدی که واسم گذاشتید ارور میده اگر ممکنه یک پروژه قرار بدید. خیلی ممنونم دوست عزیز
SaeiD-as 10 سال پیش
پاسخ سوم از همین پست رو بخونید کامل در مورد ارسال پارامتر توضیح داده ام و حتی همین کد رو بالا هم قرار داده ام، یک مقدار وقت روش بگذارید کاملا واضح هست، اروری که میگیرید رو قرار بدید تا بیشتر بتونم کمکتون کنم
mehdi 10 سال پیش
سلام من کد برنامه رو پایین قرار دادم اگر ممکنه کمکم کنید تا مشکلم رفع بشه چند وقته خیلی اعصابمو بهم ریخته توی انجمن های خارجی هم گشتم چیزی در مورد این پیدا نکردم. اگر امکانش هست یک پروژه اپلود کنید تا مشکلم رفع بشه . متشکرم دوست عزیزم
mehdi 10 سال پیش
واقعا خیلی به این کد نیاز دارم.
mehdi 10 سال پیش
سلام دوست عزیز یک مشکل دیگه واسم پیش اومد اگر ممکنه اینبار هم کمکم کن . میخوام کاری کنم از سمت سرور اطلاعات را به این صورت بگیرم String result = WebService.doWebRequestPost( لینک , params); یعنی اطلاعاتی که میخوام از سمت سرور بگیرم توی متغیر Result قرار بگیره متشکر.
mehdi 10 سال پیش
سلام دوست عزیز یک مشکل دیگه واسم پیش اومد اگر ممکنه اینبار هم کمکم کن . میخوام کاری کنم از سمت سرور اطلاعات را به این صورت بگیرم "String result = WebService.doWebRequestPost( لینک , params);" یعنی اطلاعاتی که میخوام از سمت سرور بگیرم توی متغیر Result قرار بگیره متشکر.
mehdi 10 سال پیش
سلام دوست عزیز یک مشکل دیگه واسم پیش اومد اگر ممکنه اینبار هم کمکم کن . میخوام کاری کنم از سمت سرور اطلاعات را به این صورت بگیرم String result = WebService.doWebRequestPost("192.168.1.7:1370/Note_server/", params) یعنی اطلاعاتی که میخوام از سمت سرور بگیرم توی متغیر Result قرار بگیره متشکر.
mehdi 10 سال پیش

    

کلاس وب سرویس
public static void readFromNetwork(String url, final HashMap params){


StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {

@Override
public void onResponse(String response) {

}
}, new Response.ErrorListener() {

@Override
public void onErrorResponse(VolleyError ex) {}
}) {

@Override
protected Map<String, String> getParams() {
return params;
}


@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return params;
}
};
RequestQueue queue = Volley.newRequestQueue(G.currentActivity);
queue.add(request);
}







کلاس G

public static Activity currentActivity;
public static String URL = "http://192.168.1.7/";




کلاس اصلی MainActivity

HashMap<String, String> params = new HashMap<String, String>();
params.put("title","abcd");
params.put("desc", "123456");


WebService.readFromNetwork(G.URL + "Note_server/CMD/insert.php" , params);











ارور های برنامه

08-21 06:29:02.960 1849-1849/com.example.yaali.volleyproject1 E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.yaali.volleyproject1/com.example.yaali.volleyproject1.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
at android.app.ActivityThread.access$600(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:43)
at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:78)
at com.example.yaali.volleyproject1.MyVolley.readFromNetwork(MyVolley.java:49)
at com.example.yaali.volleyproject1.MainActivity.onCreate(MainActivity.java:29)
at android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
at android.app.ActivityThread.access$600(ActivityThread.java:123) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4424) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
at dalvik.system.NativeStart.main(Native Method) 


نظرات

SaeiD-as 10 سال پیش
سلام، ببخشید من دیر به دیر به سایت سر میزنم، پروژه زیر رو ببین، من کلاس WebService رو براش نساختم، اگه از همین جواب گرفتی تابعش رو خودت بساز، موفق باشی لینک
mehdi 10 سال پیش

  "String result = WebService.doWebRequestPost("http://192.168.1.7:1370/Note_server/getlist.php", null);"

نظرات


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