【问题标题】:Android App stops when adding to request Queue of volley libAndroid 应用程序在添加到 volley lib 的请求队列时停止
【发布时间】:2015-07-25 10:15:53
【问题描述】:

我正在尝试为我的 Android 应用创建注册活动。我按照此链接上的教程进行操作:Android Login and Registration with PHP, MySQL and SQLite

本教程帮助我使用 php api 将我的应用程序连接到 MYSQL 数据库,并使用 volley 库帮助我连接互联网请求。遵循教程并仔细应用其步骤后,当我尝试该应用程序时,该应用程序在注册过程发生之前停止。弹出一个窗口说:“不幸的是,我的应用程序已停止。”。 我一直在跟踪代码,直到找到导致错误的行,但我不知道为什么会导致这样的错误或如何修复它。以下是我的代码:

注册活动(输入注册数据并单击按钮的主要活动):

package com.example.coolpoolers;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.ToggleButton;
import android.os.Build;

import app.AppConfig;
import app.AppController;
import helper.SQLiteHandler;
import helper.SessionManager;

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

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

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;

public class SignUp extends Activity {

private static final String TAG = SignUp.class.getSimpleName();
private EditText inputFullName;
private EditText inputEmail;
private EditText inputPassword;
private ProgressDialog pDialog;
private SessionManager session;
private SQLiteHandler db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_up);

    inputFullName = (EditText) findViewById(R.id.name);
    inputEmail = (EditText) findViewById(R.id.email);
    inputPassword = (EditText) findViewById(R.id.password);

    findViewById(R.id.signupBt).setOnClickListener(signupBt);

    pDialog = new ProgressDialog(this);
    pDialog.setCancelable(false);

    // Session manager
    session = new SessionManager(getApplicationContext());

    // SQLite database handler
    db = new SQLiteHandler(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(SignUp.this,
                AfterSignIn.class);
        startActivity(intent);
        finish();
    }
}

OnClickListener signupBt = new OnClickListener(){
    @Override
    public void onClick(View v) {

        String name = inputFullName.getText().toString();
        String email = inputEmail.getText().toString();
        String password = inputPassword.getText().toString();



        if (!name.isEmpty() && !email.isEmpty() && !password.isEmpty()) {

            registerUser(name, email, password);
        } else {
            Toast.makeText(getApplicationContext(),
                    "Please enter your details!", Toast.LENGTH_LONG)
                    .show();
        }
    }
};

 /**
 * Function to store user in MySQL database will post params(tag, name,
 * email, password) to register url
 * */
private void registerUser(final String name, final String email,
        final String password) {
    // Tag used to cancel the request
    String tag_string_req = "req_register";

    pDialog.setMessage("Registering ...");
    showDialog();

    StringRequest strReq = new StringRequest(Method.POST,
            "MY IP", new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {

                    Log.d(TAG, "Register Response: " + response.toString());
                    hideDialog();

                    try {

                        JSONObject jObj = new JSONObject(response);
                        boolean error = jObj.getBoolean("error");
                        if (!error) {
                            // User successfully stored in MySQL
                            // 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 login activity
                            Intent intent = new Intent(
                                    SignUp.this,
                                    LogIn.class);
                            startActivity(intent);
                            finish();
                        } else {

                            // Error occurred in registration. Get the error
                            // message
                            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, "Registration Error: " + error.getMessage());

                    Toast.makeText(getApplicationContext(),
                            error.getMessage(), Toast.LENGTH_LONG).show();
                    hideDialog();
                }
            }) {

        @Override
        protected Map<String, String> getParams() {

            // Posting params to register url
            Map<String, String> params = new HashMap<String, String>();
            params.put("tag", "register");
            params.put("name", name);
            params.put("email", email);
            params.put("password", password);

            return params;
        }

    };
    strReq.getBodyContentType();
    Toast.makeText(getApplicationContext(),
            tag_string_req, Toast.LENGTH_LONG)
            .show();

    // Adding request to request queue
    **error line below**
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}

private void showDialog() {
    if (!pDialog.isShowing())
        pDialog.show();
}

private void hideDialog() {
    if (pDialog.isShowing())
        pDialog.dismiss();
}

}

以下是按下注册按钮后从 logcat 复制的错误日志。下面提到的错误发生的第 230 行在上面的代码中提到为:error line below

E/AndroidRuntime(842):致命异常:主要

E/AndroidRuntime(842): java.lang.NullPointerException

E/AndroidRuntime(842): 在 com.example.coolpoolers.SignUp.registerUser(SignUp.java:230)

错误行调用其方法的AppController类:

package app;

import android.app.Application;
import android.text.TextUtils;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

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);
        }
    }
}

真的很感激任何帮助。我真的被困住了。此外,如果缺少任何数据并且您需要我将其添加到我的代码中,这可能有助于定义错误或其原因告诉我,我会添加它。

我正在使用 Eclipse Mars,java 1.7,SDK 19 最多安装 24,ubuntu 14.04。

谢谢。

【问题讨论】:

    标签: android eclipse ubuntu-14.04 android-volley


    【解决方案1】:

    AppController 实例似乎给出了空指针异常。 你有没有在 android manifest 中提到过 yourAppController。
    < application android:name="app.AppController" .......> </application>

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多