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

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

SaeiD-as  9 سال پیش  8 سال پیش
+8 0

سلام دوستان

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

0 0
ماژول یه سری باگ داره.کسی هم برای کامل کردنش تلاش نمیکنه نمیدونم چرا.من از کلاس G فراخوانی میکنم اطلاعات دریافت میشه ولی بعضی اوقات برنامه رو اجرا میکنی لیست خالی نمایش داده میشه .اگه از داخل خود اکتیویتی هم اجرا کنی اول لیست پر میشه بعد اطلاعات دریافت میشه که باعث میشه لیست خالی بمونه.کش وب سرویس هم نمیدونم چرا کار نمیکنه اطلاعات بر روی یک فایل ذخیره میشه ولی وقتی میگی از کش بخون چیزی خونده نمیشه نمیدونم چرا ؟ اگه این مشکلات رو حل کردی به منم کمک کن.در حال حاضر بهترین راه استفاده از Volley و Asynktask هستش البته اگه اگه وب سرویس اولی که استاد معرفی کرده هم ترد بندی بشه خوبه. (9 سال پیش)
0 0
فک کنم بهترین راهش استفاده از لایبری ها است، طریقه استفاده از لایبری volley رو میتونی یه توضیح مختصر بدی؟ خیلی گشتم اما درست متوجه نشدم! (9 سال پیش)
0 0
لینک (8 سال پیش)
 برای این سوال 9 پاسخ وجود دارد.
پاسخ به سوال 
شهریار توکلی  9 سال پیش
+7 0

اول کتابخانه ی 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);
}
+1 0
مرسی رفیق، با این لایبری میتونیم مدت زمان استفاده از کش وب سرویس و یا connectionTimeOut یا socketTimeOut و ... رو هم تعریف کنیم؟ (9 سال پیش)
+1 0
تا اینجایی که در مورد این لایبرری تحقیق کردم اطلاعات رو کش میکنه.حالا تو استک در موردش یه جستجو انجام بده. (9 سال پیش)
پاسخ به سوال 
SaeiD-as  9 سال پیش
+8 0

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

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

موفق باشید

0 0
با تشکر.در مورد کش volley اطلاعاتی پیدا کردی ؟ (9 سال پیش)
0 0
دمت گرم سالار (9 سال پیش)
0 0
@محمد آقا ، خواهش میکنم، انجام وظیفه است :) (9 سال پیش)
0 0
سلام، اون دوتا ارسال پارمتر داره، تفاوتش getHeaders() throws AuthFailureError گذاشته چه فرقی باهم دارند؟ (9 سال پیش)
0 0
سلام. من با این روش عکسهام رو آپلود میکنم. با موفقیت به سرور میره. ولی همش این متد اجرا میشه @Override public void onErrorResponse(VolleyError ex) { در صورت دریافت نکردن اطلاعات کدهای این قسمت اجرا میشود } (8 سال پیش)
پاسخ به سوال 
شهریار توکلی  9 سال پیش
+2 0

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

@Override
publicMap<String,String> getHeaders()throwsAuthFailureError{
params.put(" "," ");ارسالپارامترها
returnparams;
}
+2 0
خودمم دقیق متوجه نشدم! برای محکم کاری این قسمت هم پارامترهامو میفرستم! البته حذفش هم کردم زیاد فرقی نداشت (9 سال پیش)
پاسخ به سوال 
Hossein Kurd  9 سال پیش
+3 0

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

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

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

مثلا من کلاس :

UIHelpers

ExceptonHelpers

ActivityHelpers

و ...

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

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

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

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

پاسخ به سوال 
mehdi  8 سال پیش
0 0

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

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

String result =Webservice.readUrl("http://192.168.56.1/note/index.php",params);
0 0
کار سختی نیست، کافیه کدهای ارتباط با سرور volley رو داخل کلاس دیگه ای قرار بدید و مقادیر ورودی رو براش String و HashMap تعیین کنید. و هر جایی که خواستید اون رو فراخوانی کنید آدرس سایتتون و پارامترها رو ارسال کنید (8 سال پیش)
0 0
اگر ممکنه نمونه کد بزارید. (8 سال پیش)
0 0
نمونه کد رو در زیر قرار دادم؛ موفق باشید (8 سال پیش)
پاسخ به سوال 
SaeiD-as  8 سال پیش
+1 0

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

موفق باشید

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

    

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


0 0
سلام، ببخشید من دیر به دیر به سایت سر میزنم، پروژه زیر رو ببین، من کلاس WebService رو براش نساختم، اگه از همین جواب گرفتی تابعش رو خودت بساز، موفق باشی لینک (8 سال پیش)
پاسخ به سوال 
mehdi  8 سال پیش
0 0

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

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