Мой запрос StringRequest вызывает ошибку залпа ноль - PullRequest
0 голосов
/ 03 октября 2018

Я потратил часы на отладку этой проблемы, и я чувствовал, что действительно был близок к тому, чтобы заставить ее работать, но я просто не могу понять эту ошибку.Я точно знаю, что мой 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>

...