在 Android 中创建 Volley RequestQueue 时出错

Error while creating Volley RequestQueue in Android

我在 android 工作室创建了一个新服务,并尝试实现一个通用的 Volley 请求。创建 RequestQueue 时出现一些错误。我知道我在 this 上下文中做错了,但不知道我到底在哪里做错了。

我正在从 MainActivity 调用 volleyPost(),如下所示。

MainActivity.java

import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.HttpHeaderParser;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

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

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

public class MainActivity extends AppCompatActivity {

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

        final Button login = (Button) findViewById(R.id.CompanyLogin);
        final EditText companyName = (EditText) findViewById(R.id.CompanyName);
        final EditText companyPassword = (EditText) findViewById(R.id.CompanyPassword1);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(companyName.getText().toString().isEmpty()){
                    Toast.makeText(MainActivity.this, "Company ID is empty", Toast.LENGTH_LONG).show();
                }
                else if(companyPassword.getText().toString().isEmpty()){
                    Toast.makeText(MainActivity.this, "Password is empty", Toast.LENGTH_LONG).show();
                }
                else{
                    companyLogin(companyName.getText().toString(), companyPassword.getText().toString());
                }
            }
        });

    }

    public interface VolleyCallback {
        void onSuccess(String result);
    }

    public void companyLogin(String companyname, String password) {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        String URL = "http://...";
        final Map<String, String> params = new HashMap<String, String>();
        params.put("name", companyname);
        params.put("pwd", password);

        VolleyAPIService volleyAPIService = new VolleyAPIService();
        volleyAPIService.volleyPost(new VolleyCallback() {
            @Override
            public void onSuccess(String result) {
                //do stuff here
                Log.d("VOLLEY", "onSuccess: " + result);
                if(!result.isEmpty()){
                    Intent userLoginActivity = new Intent(MainActivity.this, UserLogin.class);
                    startActivity(userLoginActivity);
                }
                else{
                    AlertDialog.Builder login_failed = new AlertDialog.Builder(MainActivity.this);
                    login_failed.setMessage("Login Failed, invalid credentials")
                            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {

                                }
                            });
                    AlertDialog alert = login_failed.create();
                    alert.show();
                }
            }
        }, URL, params);
    }
}

VolleyAPIService.java

import android.content.DialogInterface;
import android.content.Intent;
import android.os.IBinder;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.app.Service;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

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

public class VolleyAPIService extends Service {
    public VolleyAPIService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    public void volleyPost(final MainActivity.VolleyCallback callback, String URL, Map<String, String> param) {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        final Map<String, String> params = param;

        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        callback.onSuccess(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                    }
                }) {
            @Override
            protected Map<String, String> getParams() {;
                return params;
            }
        };
        requestQueue.add(stringRequest);
    }
}

报错信息如下

E/AndroidRuntime:致命异常:main 过程:com.example.alfatkgindia.sample1,PID:22875 java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'java.io.File android.content.Context.getCacheDir()' 在 android.content.ContextWrapper.getCacheDir(ContextWrapper.java:262) 在 com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:89) 在 com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:67) 在 com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:102) 在 com.example.alfatkgindia.sample1.VolleyAPIService.volleyPost(VolleyAPIService.java:32) 在 com.example.alfatkgindia.sample1.MainActivity.companyLogin(MainActivity.java:99) 在 com.example.alfatkgindia.sample1.MainActivity$1.onClick(MainActivity.java:54) 在 android.view.View.performClick(View.java:6305) 在 android.view.View$PerformClick.run(View.java:24840) 在 android.os.Handler.handleCallback(Handler.java:790) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6501) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

您的上下文为空,因为您实例化了一项服务。您不能只实例化一个服务。你让框架为你做。如果要启动服务,请使用startService 方法。

如果您打算 运行 在后台线程中使用登录方法,那么除了服务之外还有其他选择。您可以使用 AsyncTask 或 AsyncLoaders。