Я потратил часы на отладку этой проблемы, и я чувствовал, что действительно был близок к тому, чтобы заставить ее работать, но я просто не могу понять эту ошибку.Я точно знаю, что мой URL-адрес правильный и что мой PHP-код работает.Я подтвердил это, поместив URL-адрес в браузер телефона, на котором запущено приложение, и он вернул мне правильный объект JSON в основном теле HTML полученной страницы.Кроме того, если я установил в своем PHP-коде ошибку (я сделал переменную неопределенной), тогда код покажет, что в качестве ответа входа в систему и залп не будет ошибкой.
Итак, я точно знаю, что код PHP возвращает правильный ответ и что я устанавливаю правильное соединение с моим сервером, поэтому ошибки нет.Всякий раз, когда PHP действителен, возникает ошибка Volley, прежде чем он получит ответ от PHP.Что-то должно быть не так с залпом, но я не знаю, что это такое.
Другие подробности, которые могут помочь: -По какой-то причине он вызывает getParams () дважды.
Ниже приведен код для всего Строкового запроса, ошибок и приложения Singleton.
Вот код для моего Строкового запроса:
private void loginUser( final String email, final String password) {
// Tag used to cancel the request
String cancel_req_tag = "login";
progressDialog.setMessage("Logging you in...");
showDialog();
StringRequest strReq = new StringRequest(Request.Method.POST, URL_FOR_LOGIN, new Response.Listener<String>()
{
@Override
public void onResponse(String response) {
Log.d(TAG, "Login Response: " + response);
hideDialog();
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
if (!error) {
String user = jObj.getJSONObject("user").getString("name");
// Launch User activity
Intent intent = new Intent(
LoginActivity.this,
UserActivity.class);
intent.putExtra("username", user);
startActivity(intent);
finish();
} else {
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Volley Error in login Activity: " + error.getMessage());
for(int i = 0; i<error.getStackTrace().length; i++)
{
Log.e(TAG, "Class name for Stack Trace element " + i +": " + error.getStackTrace()[i].getClassName());
Log.e(TAG, "File name for Stack Trace element " + i +": " + error.getStackTrace()[i].getFileName());
Log.e(TAG, "Line Number for Stack Trace element " + i +": " + error.getStackTrace()[i].getLineNumber());
Log.e(TAG, "Method name for Stack Trace element " + i +": " + error.getStackTrace()[i].getMethodName());
Log.e(TAG, "Result from isNativeMethod " + i +": " + error.getStackTrace()[i].isNativeMethod());
}
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
})
{
@Override
protected Map<String, String> getParams() {
// Posting params 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
AppSingleton.getInstance(getApplicationContext()).addToRequestQueue(strReq,cancel_req_tag);
}
А вот и сообщение об ошибке, которое я получаю: E / LoginActivity: Ошибка залпа при входе в активность: null
Вот данные из цикла трассировки стека, которые я запустил при ошибке залпа
Class name for Stack Trace element 0: com.android.volley.toolbox.BasicNetwork
File name for Stack Trace element 0: BasicNetwork.java
Line Number for Stack Trace element 0: 173
Method name for Stack Trace element 0: performRequest
Result from isNativeMethod 0: false
Class name for Stack Trace element 1: com.android.volley.NetworkDispatcher
File name for Stack Trace element 1: NetworkDispatcher.java
Line Number for Stack Trace element 1: 131
Method name for Stack Trace element 1: processRequest
Result from isNativeMethod 1: false
Class name for Stack Trace element 2: com.android.volley.NetworkDispatcher
File name for Stack Trace element 2: NetworkDispatcher.java
Line Number for Stack Trace element 2: 111
Method name for Stack Trace element 2: processRequest
Result from isNativeMethod 2: false
Class name for Stack Trace element 3: com.android.volley.NetworkDispatcher
File name for Stack Trace element 3: NetworkDispatcher.java
Line Number for Stack Trace element 3: 90
Method name for Stack Trace element 3: run
Result from isNativeMethod 3: false
Код залпового залпа:
public class AppSingleton {
private static AppSingleton mAppSingletonInstance;
private RequestQueue mRequestQueue;
private static Context mContext;
private AppSingleton(Context context) {
mContext = context;
mRequestQueue = getRequestQueue();
}
public static synchronized AppSingleton getInstance(Context context) {
if (mAppSingletonInstance == null) {
mAppSingletonInstance = new AppSingleton(context);
}
return mAppSingletonInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req,String tag) {
req.setTag(tag);
getRequestQueue().add(req);
}
}
Вот мой манифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycallstracker.mycallstracker">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".RegisterActivity"/>
<activity android:name=".UserActivity" />
</application>