خطا در اتصال به سرور و دریافت json به کمک کتابخانه volley
سلام دوستان.
من یه کلاس برای Register / Login کردن کاربران (برای ورود / ثبت نام در برنامه) نوشتم، و موقع اجرا شدن برنامه ، موقعی که بر روی دکمه register کلیک میکنم خطای force close میده !
متن خطا رو در ادامه آوردم! چیزی که از ظاهرش پیداست Null pointer Exception هست! اما خیلی گشتم تا مشکل رو پیدا کنم ولی متاسفانه نتونستم پیداش کنم.
اگه ممکنه راهنمایی کنید .
ممنون ام دوستان.
کد های مربوط به خطا :
btnLogin.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
String email = inputEmail.getText().toString().trim();
String password = inputPassword.getText().toString().trim();
// Check for empty data in the form
if (!email.isEmpty() && !password.isEmpty()) {
// login user
checkLogin(email, password);
} else {
// Prompt user to enter credentials
Toast.makeText(getApplicationContext(),
"Please enter the credentials!", Toast.LENGTH_LONG)
.show();
}
}
});
private void checkLogin(final String email, final String password) {
// Tag used to cancel the request
String tag_string_req = "req_login";
pDialog.setMessage("Logging in ...");
showDialog();
StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_LOGIN, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Login Response: " + response.toString());
hideDialog();
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error) {
// user successfully logged in
// Create login session
session.setLogin(true);
// Now store the user in SQLite
String uid = jObj.getString("uid");
JSONObject user = jObj.getJSONObject("user");
String name = user.getString("name");
String email = user.getString("email");
String created_at = user
.getString("created_at");
// Inserting row in users table
db.addUser(name, email, uid, created_at);
// Launch main activity
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
finish();
} else {
// Error in login. Get the error message
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Login Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
params.put("email", email);
params.put("password", password);
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
متن خطا:
08-07 19:06:21.086 3740-3740/com.avr.logreg E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at activity.LoginActivity.checkLogin(LoginActivity.java:186)
at activity.LoginActivity.access$200(LoginActivity.java:32)
at activity.LoginActivity$1.onClick(LoginActivity.java:80)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
این کلاس LoginActivity ام هست.
package activity;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.avr.logreg.MainActivity;
import com.avr.logreg.R;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
import app.AppConfig;
import app.AppController;
import helper.SQLiteHandler;
import helper.SessionManager;
public class LoginActivity extends Activity {
private static final String TAG = RegisterActivity.class.getSimpleName();
private Button btnLogin;
private Button btnLinkToRegister;
private EditText inputEmail;
private EditText inputPassword;
private ProgressDialog pDialog;
private SessionManager session;
private SQLiteHandler db;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
inputEmail = (EditText) findViewById(R.id.email);
inputPassword = (EditText) findViewById(R.id.password);
btnLogin = (Button) findViewById(R.id.btnLogin);
btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen);
// Progress dialog
pDialog = new ProgressDialog(this);
pDialog.setCancelable(false);
// SQLite database handler
db = new SQLiteHandler(getApplicationContext());
// Session manager
session = new SessionManager(getApplicationContext());
// Check if user is already logged in or not
if (session.isLoggedIn()) {
// User is already logged in. Take him to main activity
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
// Login button Click Event
btnLogin.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
String email = inputEmail.getText().toString().trim();
String password = inputPassword.getText().toString().trim();
// Check for empty data in the form
if (!email.isEmpty() && !password.isEmpty()) {
// login user
checkLogin(email, password);
} else {
// Prompt user to enter credentials
Toast.makeText(getApplicationContext(),
"Please enter the credentials!", Toast.LENGTH_LONG)
.show();
}
}
});
// Link to Register Screen
btnLinkToRegister.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent i = new Intent(getApplicationContext(),
RegisterActivity.class);
startActivity(i);
finish();
}
});
}
/**
* function to verify login details in mysql db
* */
private void checkLogin(final String email, final String password) {
// Tag used to cancel the request
String tag_string_req = "req_login";
pDialog.setMessage("Logging in ...");
showDialog();
StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_LOGIN, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Login Response: " + response.toString());
hideDialog();
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error) {
// user successfully logged in
// Create login session
session.setLogin(true);
// Now store the user in SQLite
String uid = jObj.getString("uid");
JSONObject user = jObj.getJSONObject("user");
String name = user.getString("name");
String email = user.getString("email");
String created_at = user
.getString("created_at");
// Inserting row in users table
db.addUser(name, email, uid, created_at);
// Launch main activity
Intent intent = new Intent(LoginActivity.this,
MainActivity.class);
startActivity(intent);
finish();
} else {
// Error in login. Get the error message
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Json error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Login Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
params.put("email", email);
params.put("password", password);
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
private void showDialog() {
if (!pDialog.isShowing())
pDialog.show();
}
private void hideDialog() {
if (pDialog.isShowing())
pDialog.dismiss();
}
}
این هم کل logcat موقع crash کردن برنامه :
08-11 09:21:33.855 1513-1513/com.avr.logreg E/Trace: error opening trace file: No such file or directory (2)
08-11 09:21:36.022 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.util.ArrayMap', referenced from method com.android.tools.fd.runtime.MonkeyPatcher.monkeyPatchExistingResources
08-11 09:21:36.024 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.util.ArrayMap', referenced from method com.android.tools.fd.runtime.MonkeyPatcher.pruneResourceCache
08-11 09:21:36.286 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.294 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.294 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.294 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.media.session.MediaController', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.294 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.widget.Toolbar', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.app.ActivityManager$TaskDescription', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.app.SharedElementCallback', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.transition.TransitionManager', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.app.SharedElementCallback', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.app.assist.AssistContent', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.view.SearchEvent', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method activity.LoginActivity.access$super
08-11 09:21:36.304 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.PersistableBundle', referenced from method activity.LoginActivity.access$super
08-11 09:22:04.494 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method app.AppController.access$super
08-11 09:22:04.494 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method app.AppController.access$super
08-11 09:22:04.494 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method app.AppController.access$super
08-11 09:22:04.494 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.app.Application$OnProvideAssistDataListener', referenced from method app.AppController.access$super
08-11 09:22:04.494 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method app.AppController.access$super
08-11 09:22:04.494 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method app.AppController.access$super
08-11 09:22:04.494 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.os.UserHandle', referenced from method app.AppController.access$super
08-11 09:22:04.494 1513-1513/com.avr.logreg E/dalvikvm: Could not find class 'android.app.Application$OnProvideAssistDataListener', referenced from method app.AppController.access$super
08-11 09:22:04.545 1513-1513/com.avr.logreg E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at activity.LoginActivity.checkLogin(LoginActivity.java:187)
at activity.LoginActivity.access$200(LoginActivity.java:32)
at activity.LoginActivity$1.onClick(LoginActivity.java:81)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
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:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private RequestQueue mRequestQueue;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
بجای استفاده از تابع زیر
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
خیلی ساده strReq رو به queue اضافه کردم:
queue.add(strReq);
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .