ورود

View Full Version : عدم اجرای کد در کتابخانه والی در متد Response



CodeforLife
یک شنبه 10 بهمن 1395, 21:40 عصر
سلام به شما دوستان عزیز
من قطعه کدی نوشتم که به سرور وصل بشه و یه سری داده رو ببره مثل username, password اونها چک میکنه اگر مساوی بود که هست اطلاعات رو برمی گردونه .
که داره درست کار می کنه .تست کردم
مشکلی که هست وقتی در متد Responce والی میاد انگار که نمیاد ولی میاد من یه log گذاشتم که اون رو نمایش میده اطلاعات درسته .
ولی در کنترل رو ی صفحه null نشون میده ...
من کاملا گیج شدم .
کدها رو میذارم


public String logInAdminToServer(JSONObject jsonObject) {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,
"http://192.168.43.206/project-server/Admin.php?action=LogInAdmin", jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
firstName = response.getString("AdminFirstName");
lastName = response.getString("AdminLastName");
Log.i("Error", firstName + lastName);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Error", error.toString());
}
});
Volley.newRequestQueue(G.context).add(request);
return firstName + "," + lastName;
}


log رو نشون میده یعنی اطلاعات رو درست می گیره ولی در زمان اجرا روی صفحه من در تکس ویو به جای نام و نام خانوادگی که گرفته null, nullدارم
فکر کنم دلیل اون delay در volley هست .اینترفیس هم گذاشتم حل نشد ...
کمک کنید لطفا

#root#
یک شنبه 10 بهمن 1395, 22:21 عصر
به نظر میاد درک صحیحی از برنامه نویسی Asynchronous ندارید، متد شما در یک آن اجرا میشه و به return میرسه، ولی درخواست دریافت اطلاعات از سرور با لحضاتی تاخیر دریافت میشه که کاملا طبیعی هست، راه حل های زیادی برای حل این مسئله هست، برای نمونه:


public void logInAdminToServer(JSONObject jsonObject, TextView myTextView) {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,
"http://192.168.43.206/project-server/Admin.php?action=LogInAdmin", jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
firstName = response.getString("AdminFirstName");
lastName = response.getString("AdminLastName");
Log.i("Error", firstName + lastName);
myTextView.setText(firstName + "," + lastName);
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Error", error.toString());
}
});
Volley.newRequestQueue(G.context).add(request);
}


فراخوانی:
logInAdminToServer(myJson , myTextView);

CodeforLife
دوشنبه 11 بهمن 1395, 08:52 صبح
سلام وممنونم من این کد که شما فرمودین رو تغییر دادم خطا دارم
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.parisa.myfinallproject.ApiService.logI nAdminToServer(org.json.JSONObject, android.widget.EditText)' on a null object reference
at com.example.parisa.myfinallproject.LoginActivity.l ogInAdmin(LoginActivity.java:58)
و اینکه اگر ممکنه راه کارهای دیگه ای بهم بگین جون من باید این رو در کلاس های بذارم که مربوط به model و pressenter هست و من باید پترن ها رو هم رعایت کنم .
اگر راه دیگه ای دارید بهم بگین که من زودتر این مسئله رو حل کنم ...متشکرم

CodeforLife
دوشنبه 11 بهمن 1395, 15:48 عصر
سلام من این کد روهم نوشتم ولی جوابی که میده خیلی دیره و به درد نمی خوره

public void logInAdminToServer(JSONObject jsonObject, final VolleyCallback callback) {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,
"http://192.168.43.206/project-server/Admin.php?action=LogInAdmin", jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
if (response != null) {
try {
Log.i("Error", response.getString("AdminFirstName") + response.getString("AdminLastName"));
callback.OnSuccess(response.getString("AdminFirstName") + "," + response.getString("AdminLastName"));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("Error", error.toString());
}
});
request.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
Volley.newRequestQueue(G.context).add(request);
}

public interface VolleyCallback {
void OnSuccess(String result);
}




public void logInAdmin() {
try {
object.put("AdminUserName", adminUserName);
object.put("AdminPassword", adminPassword);
} catch (JSONException ex) {
ex.printStackTrace();
}
//
//basic login operation
//
thread = new Thread(new Runnable() {
@Override
public void run() {
apiService.logInAdminToServer(object, new ApiService.VolleyCallback() {
@Override
public void OnSuccess(String result) {
if (result != null) {
String str[] = result.split(",");
adminFirstName = str[0];
adminLastName = str[1];
}
}
});
}
});
thread.start();
}

godofphp
دوشنبه 11 بهمن 1395, 23:35 عصر
کارگاه آموزشی کتابخانه ی volley در اندروید (http://samenta.ir/%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-%DB%8C-volley-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF/)

CodeforLife
سه شنبه 12 بهمن 1395, 07:37 صبح
سلام دوستان .ممنونم
من فیلم آموزشی نگاه کردم سایت ها رو هم مطالعه کردم . ولی مسئله ای که من دارم چیز دیگری هست اینه که من اطلاعات رو از سمت سرور میگیرم . ولی تا بگیرم دیر میشه و دیگه کنترلی که در صفحه نمایش هست مقدار گرفته
برای اینکه من این زمان رو همزمان کنم و یا یه جوری کنترل کنم باید چه کار کنم ؟؟؟
یه لینک مفید هم اگر تونستید برام بزارید الان دو روزه هر چیزی رو امتحان کردم ....نشد
ممنونم

godofphp
سه شنبه 12 بهمن 1395, 09:12 صبح
ولی مسئله ای که من دارم چیز دیگری هست اینه که من اطلاعات رو از سمت سرور میگیرم . ولی تا بگیرم دیر میشه و دیگه کنترلی که در صفحه نمایش هست مقدار گرفته
متوجه منظورتون نشدم یه ذره واضح تر بگید
خب شرط بزارید تا زمانی که اطلاعات از سرور نرسیده کنترل رو نمایش نده !
متد onresponse زمانی اجرا میشه که اطلاعات از سرور رسیده میتونی کنترل را hide کنی و درون متد onresponse مجدد نمایش بدی اون موقع تا زمانی که اطلاعات نرسیده کنترل نمایش داده نمیشه که مقدار دهی هم بشه

CodeforLife
سه شنبه 12 بهمن 1395, 09:29 صبح
ممنونم . اینکه من داخل onresponse از کنترل هااستفاده کنم کار درستیه؟؟؟

CodeforLife
سه شنبه 12 بهمن 1395, 10:03 صبح
دوست عزیز ممنون از راهنمایی شما ولی فرض می کنیم من می خوام یه متغییر رو در
response
مقدار دهی کنم بعد در کلاسهای دیگه با اون کار کنم ....اصلا کار بهم میریزه که !!! شما یه نمونه کدی چیزی نداری به من بدین ببینم شما چه طور کار میکنید ؟؟؟

godofphp
چهارشنبه 13 بهمن 1395, 10:02 صبح
دوست عزیز ممنون از راهنمایی شما ولی فرض می کنیم من می خوام یه متغییر رو در
response
مقدار دهی کنم بعد در کلاسهای دیگه با اون کار کنم ....اصلا کار بهم میریزه که !!! شما یه نمونه کدی چیزی نداری به من بدین ببینم شما چه طور کار میکنید ؟؟؟
منظورتون از اینکه کار بهم میریزه چیه ؟ شما باید عملیاتی که بعد از دریافت نتیجه ی سرور میخواهید انجام بشه رو حتما داخل متد onResponse بنویسید
شما حتی یکبار به خودتون زحمت ندادی لینکی که دادم رو کامل مطالعه کنید و اگه مطالعه میکردید چنین سوالهای پیش پا افتاده و تکراری رو مطرح نمیکردید