اشکال در استفاده از ماژول وب سرویس و استفاده از کتابخانه volley
سلام دوستان
من در برنامه ام برای قسمت ورود کاربران از کلاس 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 دادم هم اعمال نمیشه! همین مشکلو جاهای دیگه برنامه ام هم دارم، ممنون میشم راهنمایی کنید




اول کتابخانه ی 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);
}

پس از پرس و جوی بسیار تصمیم گرفتم از کتابخانه 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);
توضیحات بیشتر و دریافت سمپل: لینک
موفق باشید

این قسمت چه کاری انجام میده ؟ پارامتری که در بالا ارسال میکنیم باید در این کد هم ارسال کنیم ؟
@Override
publicMap<String,String> getHeaders()throwsAuthFailureError{
params.put(" "," ");ارسالپارامترها
returnparams;
}

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

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

سلام دوستان کسی میدونه چطور میشه پارامتر ها رو به این صورت به Volley ارسال کنیم
مثلا کد Volley رو در یک کلاس دیگه قرار بدیم و با این دستور بهش URL و پارامتر بدیم.
String result =Webservice.readUrl("http://192.168.56.1/note/index.php",params);

من کد رو به این صورت خودم استفاده میکنم: 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 هم در بالا توضیح داده شده
موفق باشید

کلاس وب سرویس
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)

"String result = WebService.doWebRequestPost("http://192.168.1.7:1370/Note_server/getlist.php", null);"
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .