【问题标题】:onResponse Method not called of Response.listenerResponse.listener 未调用 onResponse 方法
【发布时间】:2018-03-06 05:44:27
【问题描述】:

我是 volley 的新手,并尝试为此开发一个聊天应用程序() 方法未运行,但 onResponseError() 运行结果输出未到来。代码如下

package com.example.user.gcm_chat.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

import com.example.user.gcm_chat.R;
import com.example.user.gcm_chat.app.EndPoints;
import com.example.user.gcm_chat.app.MyApplication;
import com.example.user.gcm_chat.model.User;

public class LoginActivity extends AppCompatActivity {

private String TAG = LoginActivity.class.getSimpleName();
private EditText inputName, inputEmail;
private TextInputLayout inputLayoutName, inputLayoutEmail;
private Button btnEnter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    if (MyApplication.getInstance().getPrefManager().getUser() != null) {
        startActivity(new Intent(this, MainActivity.class));
        finish();
    }

    setContentView(R.layout.activity_login);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    inputLayoutName = (TextInputLayout) findViewById(R.id.input_layout_name);
    inputLayoutEmail = (TextInputLayout) findViewById(R.id.input_layout_email);
    inputName = (EditText) findViewById(R.id.input_name);
    inputEmail = (EditText) findViewById(R.id.input_email);
    btnEnter = (Button) findViewById(R.id.btn_enter);

    inputName.addTextChangedListener(new MyTextWatcher(inputName));
    inputEmail.addTextChangedListener(new MyTextWatcher(inputEmail));

    btnEnter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            login();
        }
    });
}

/**
 * logging in user. Will make http post request with name, email
 * as parameters
 */
private void login() {
    if (!validateName()) {
        return;
    }

    if (!validateEmail()) {
        return;
    }

    final String name = inputName.getText().toString();
    final String email = inputEmail.getText().toString();

    StringRequest strReq = new StringRequest(Request.Method.POST,
            EndPoints.LOGIN, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.e(TAG, "response: " + response);

            try {
                JSONObject obj = new JSONObject(response);

                // check for error flag
                if (obj.getBoolean("error") == false) {
                    // user successfully logged in
                    JSONObject userObj = obj.getJSONObject("user");
                    User user = new User(userObj.getString("user_id"),
                            userObj.getString("name"),
                            userObj.getString("email"));

                    // storing user in shared preferences
                    MyApplication.getInstance().getPrefManager().storeUser(user);

                    // start main activity
                    startActivity(new Intent(getApplicationContext(), MainActivity.class));
                    finish();

                } else {
                    // login error - simply toast the message
                    Toast.makeText(getApplicationContext(),  obj.getJSONObject("error").getString("message"), Toast.LENGTH_LONG).show();
                }

            } catch (JSONException e) {
                Log.e(TAG, "json parsing error: " + e.getMessage());
                Toast.makeText(getApplicationContext(), "Json parse error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            NetworkResponse networkResponse = error.networkResponse;
            Log.e(TAG, "Volley error:" + error.getMessage() + ", code: " + networkResponse);
            Toast.makeText(getApplicationContext(), "Volley error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            params.put("name", name);
            params.put("email", email);

            Log.e(TAG, "params: " + params.toString());
            return params;
        }
    };

    //Adding request to request queue
    MyApplication.getInstance().addToRequestQueue(strReq);
}

private void requestFocus(View view) {
    if (view.requestFocus()) {

getWindow().setSoftInputMode(WindowManager.LayoutParams.
  SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

// Validating name
private boolean validateName() {
    if (inputName.getText().toString().trim().isEmpty()) {
        inputLayoutName.setError(getString(R.string.err_msg_name));
        requestFocus(inputName);
        return false;
    } else {
        inputLayoutName.setErrorEnabled(false);
    }

    return true;
}

// Validating email
private boolean validateEmail() {
    String email = inputEmail.getText().toString().trim();

    if (email.isEmpty() || !isValidEmail(email)) {
        inputLayoutEmail.setError(getString(R.string.err_msg_email));
        requestFocus(inputEmail);
        return false;
    } else {
        inputLayoutEmail.setErrorEnabled(false);
    }

    return true;
}

private static boolean isValidEmail(String email) {
    return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
}

private class MyTextWatcher implements TextWatcher {

    private View view;
    private MyTextWatcher(View view) {
        this.view = view;
    }

    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    }

    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    }

    public void afterTextChanged(Editable editable) {
        switch (view.getId()) {
            case R.id.input_name:
                validateName();
                break;
            case R.id.input_email:
                validateEmail();
                break;
        }
    }
}
}

端点.java

包 com.example.user.gcm_chat.app;

 public class EndPoints {

// localhost url -
public static final String BASE_URL = "http://localhost/gcm_chat/v1";
public static final String LOGIN = BASE_URL + "/user/login";
public static final String USER = BASE_URL + "/user/_ID_";
public static final String CHAT_ROOMS = BASE_URL + "/chat_rooms";
public static final String CHAT_THREAD = BASE_URL + "/chat_rooms/_ID_";
public static final String CHAT_ROOM_MESSAGE = BASE_URL + "/chat_rooms/_ID_/message";
}

错误日志

09-25 15:15:34.758 15166-15275/com.example.user.gcm_chat E/DynamiteModule:无法加载模块描述符类:找不到类“com.google.android.gms.dynamite.descriptors .com.google.firebase.auth.ModuleDescriptor" 路径:DexPathList[[zip file "/data/app/com.example.user.gcm_chat-2/base.apk"],nativeLibraryDirectories=[/data/app/com .example.user.gcm_chat-2/lib/arm64, /system/lib64, /vendor/lib64]] 09-25 15:15:42.934 15166-15844/com.example.user.gcm_chat E/LoginActivity: 参数: {email=prashu1996gupta@gmail.com, name=prashu} 09-25 15:15:46.027 15166-15166/com.example.user.gcm_chat E/LoginActivity: Volley error:null, code:null

build.gradle

apply plugin: 'com.android.application'

android {


compileSdkVersion 24
buildToolsVersion "24.0.1"

defaultConfig {
    applicationId "com.example.user.gcm_chat"
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
dexOptions {
    javaMaxHeapSize "4g"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.android.support:design:24.1.1'
compile 'com.google.android.gms:play-services:9.0.2'
compile 'com.mcxiaoke.volley:library:1.0.19'
compile 'com.android.support:recyclerview-v7:24.1.1'

}
apply plugin: 'com.google.gms.google-services'

【问题讨论】:

  • 从错误日志中可以看出,Volley 实现没有问题,firebase Auth 实现出现故障,通常找不到 firebase auth 所需的模块。做一次检查你的 gradle 依赖项。
  • firebase 身份验证的依赖项? com.google.firebase:firebase-auth:11.4.0??
  • 请有人告诉如何获取运行php服务的计算机的IP地址。
  • 取决于系统。谷歌搜索你的系统。对于 linux,它在终端中的 ifconfig 。对于 Windows,它是您 ping 网站时的第一个 IP。

标签: android android-volley


【解决方案1】:

确保您已完成授予所有其他设备的权限。 为此,请转到 Wamp->Apache->httpd.conf 和 httpd-vhosts.conf 然后更改为 required to grant

【讨论】:

    【解决方案2】:

    而不是本地主机给你的系统IP地址。本地主机是指系统。也就是说,当应用程序运行时,您的移动设备是本地主机,并且设备应连接在同一网络上。 Wifi 或 USB 连接

    public static final String BASE_URL = "http://[YOUR IP]/gcm_chat/v1";
    

    如果您使用的是安卓模拟器,请将 IP 地址设为 10.0.2.2

    希望这能解决您的问题

    【讨论】:

    • 我试过了,错误未解决 错误日志显示 192.170.**.***/gcm_chat/v1/user/login 和 Volley 的意外响应代码 403 错误:null,代码:com .android.volley.NetworkResponse@79f8757
    • 在 localhost 中使您的项目在线。如果您使用 WAMP,请检查此hsnyc.co/how-to-host-your-own-website-using-wamp-server
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2018-12-15
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多