【问题标题】:application crashes due to adding data to the database由于向数据库添加数据而导致应用程序崩溃
【发布时间】:2020-07-29 13:29:21
【问题描述】:

我是初学者 android 开发人员。但我在将数据从 android studio 添加到 phpmyadmin 时遇到问题。我找到了一个现成的代码,但是由于某种原因,当我单击按钮时,应用程序崩溃了。 我认为问题出在“NetworkCalls”。

活动:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.test.ScreenOne">

    <EditText
        android:id="@+id/etUsername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="330dp"/>

    <EditText
        android:id="@+id/etPassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPassword"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="400dp"/>

    <Button
        android:id="@+id/bSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="save"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="600dp"
        android:onClick="saveb"/>
</RelativeLayout>

主代码:

package com.test.test;

import android.app.ProgressDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

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

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

public class ScreenOne extends AppCompatActivity {

    private static final String URL_SAVE = "http://IP/save.php";
    private EditText username;
    private EditText password;
    Button save;
    String name;
    String pass;

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

        username = (EditText) findViewById(R.id.etUsername);
        password = (EditText) findViewById(R.id.etPassword);

        save = (Button) findViewById(R.id.bSave);
    }

    public void saveb(View view) {
        saveRequest();

    }

    private void saveRequest() {
        name = username.getText().toString().trim();
        pass = password.getText().toString().trim();
        final ProgressDialog mDialog = new ProgressDialog(this);
        mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        mDialog.setMessage("Loading...");
        mDialog.show();



        StringRequest request = new StringRequest(Request.Method.POST, URL_SAVE,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        mDialog.dismiss();
                        Toast.makeText(ScreenOne.this, response, Toast.LENGTH_LONG).show();
                        username.setText("");
                        password.setText("");
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        mDialog.dismiss();
                        Toast.makeText(ScreenOne.this, "Something went wrong", Toast.LENGTH_LONG).show();
                    }
                }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> key = new HashMap<>();
                key.put("username", name);
                key.put("password", pass);
                return key;
            }
        };

        NetworkCalls.getInstance().addToRequestQueue(request);
    }


}

NetworkCalls:

    package com.test.test;
    
    import android.content.Context;
    
    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.toolbox.Volley;
    
    public class NetworkCalls {
        private RequestQueue requestQueue;
        private static Context context;
    
        private static NetworkCalls ourInstance = new NetworkCalls();
    
        public static NetworkCalls getInstance() {
            return ourInstance;
        }
    
        private NetworkCalls() {
        }
    
        public RequestQueue getRequestQueue(){
            requestQueue = Volley.newRequestQueue(context.getApplicationContext());
            return requestQueue;
        }
    
        public <T> void addToRequestQueue(Request<T> request){
            getRequestQueue().add(request);
        }
    }

【问题讨论】:

  • 如果应用程序崩溃,日志中肯定有异常堆栈跟踪。将其添加到问题中
  • 小记 phpMyAdmin是用PHP写的工具它不是DBMS但MySQL是

标签: java android mysql


【解决方案1】:

您的主要问题是传递上下文当调用网络时 NetworkCalls 类获得了空上下文。所以你的应用程序崩溃了。所以像下面这样改变你的网络类。

像这样更改您的网络类:

public class NetworkCalls {
    private static NetworkCalls instance;
    private RequestQueue requestQueue;
    private static Context mContext;
        
    private NetworkCalls(Context context){
        mContext = context;
        requestQueue = getRequestQueue();
    }

    public static synchronized NetworkCalls getInstance(Context context){
        if(instance == null){
            instance = new NetworkCalls(context);
        }
        return instance;
    }
    
    public RequestQueue getRequestQueue(){
        requestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
        return requestQueue;
    }
    
    public <T> void addToRequestQueue(Request<T> request){
        getRequestQueue().add(request);
    }
}

并从 MainActivity saveRequest() 方法将此行 NetworkCalls.getInstance().addToRequestQueue(request); 更改为 NetworkCalls.getInstance(getApplicationContext()).addToRequestQueue(request);

编码愉快!

【讨论】:

  • 是的,但我还有另一个错误:错误:找不到符号 requestQueue = Volley.newRequestQueue(context.getApplicationContext()); ^ 符号:变量上下文位置:类 NetworkCalls。我该如何解决这个问题?
  • 在这一行中使用 mContext,而不是 context。我已经更新了我的答案检查。那是我的错误。像这样更改此行requestQueue = Volley.newRequestQueue(mContext.getApplicationContext());
  • 谢谢。应用程序不会崩溃,但不会将数据添加到数据库。你能帮忙吗?
  • 看来你的代码没问题。你应该检查你的后端 API。
猜你喜欢
  • 1970-01-01
  • 2018-07-22
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
相关资源
最近更新 更多