在 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。
我在 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。