我是开发Android应用程序的新手,我正在努力使用我的代码,我收到以下错误,我无法理解为什么会发生这种情况,我正在尝试使用凌空连接到一个API,但在此之前,用户必须首先登录然后查看内容。
07-01 17:21:16.143 22971-23604/com.rep E/YOUR_APP_LOG_TAG﹕ I got an error
java.lang.NullPointerException
at com.rep.webservice.volley.toolbox.Volley.newRequestQueue(Volley.java:45)
at com.rep.webservice.rest.ClientesRest.getClientes(ClientesRest.java:52)
at com.rep.webservice.Sincronizar.start(Sincronizar.java:26)
at com.rep.app.login.LoginActivity$SincronizarTask.doInBackground(LoginActivity.java:311)
at com.rep.app.login.LoginActivity$SincronizarTask.doInBackground(LoginActivity.java:280)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
我正在做的是,首先我获取API数据:
mSincronizarTask = new SincronizarTask(getApplicationContext());
mSincronizarTask.execute((Void) null);
然后我创建一个Asynctask:
public class SincronizarTask extends AsyncTask<Void, Void, Boolean> {
private Context ctx;
private ProgressDialog mProgressDialog;
private Sincronizar mSincronizar = new Sincronizar(this.ctx);
public SincronizarTask(Context activity) {
Log.i("RM", "construct");
ctx = activity;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.i("RM", "onPreExecute");
}
@Override
protected Boolean doInBackground(Void... params) {
Log.i("RM", "doInBackground");
try {
mSincronizar.start();
} catch (Exception e) {
Log.i("RM", String.valueOf(e.getStackTrace()));
}
// this.mProgressDialog.dismiss();
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
Log.i("RM", "TOTAL: " + String.valueOf(mSincronizar.total()));
}
@Override
protected void onCancelled() {
Log.i("RM", "onCancelled");
mAutenticacaoLocalTask = null;
// this.mProgressDialog.dismiss();
}
}
这是Sync类:
public class Sincronizar {
private Context context;
private List Clientes;
public Sincronizar(Context ctx) {
this.context = ctx;
}
public void start() {
try {
/* cria o objeto ClienteReste */
ClientesRest mClientesRest = new ClientesRest(this.context);
/* dispara a consulta pelo recurso "clientes" da API */
this.Clientes = mClientesRest.getClientes();
} catch (Exception e) {
Log.i("RM", String.valueOf(e.getStackTrace()));
}
}
public Integer total() {
return 100;
}
}
最后是Clientrest类:
public class ClientesRest extends Servidor {
private String recursoRest = "clientes";
private List arrayClientes;
private RequestQueue mRequestQueue ;
private Context context;
public ClientesRest(Context ctx) {
this.context = ctx;
}
public final List getClientes() {
String url = this.URL_WS + recursoRest;
Log.i("RM", "URL DE CONSULTA: " + url);
try {
mRequestQueue = Volley.newRequestQueue(this.context);
JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
parseJSON(response);
Log.i("RM", "resposta da api: " + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("RM", error.getMessage());
}
}
) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("TOKEN", "99KI9Gj68CgCf70deM22Ka64chef2C40Gm2lFJ0bDAcbFfd19MfacGf3FFm8CM1hG0eDiIk8");
return headers;
}
};
mRequestQueue.add(mJsonObjectRequest);
} catch (Exception e) {
Log.e("YOUR_APP_LOG_TAG", "I got an error", e);
}
return this.arrayClientes;
}
private void parseJSON(JSONObject json) {
try {
Log.i("RM", "executou o parseJSON");
/* array para armazenar os clientes */
this.arrayClientes = new ArrayList<ClienteModel>();
/* pega o array "dados" que vem na resposta da consulta ao rest */
JSONArray dados = json.getJSONArray("dados");
/* percorre o array */
for (int i = 0; i < dados.length(); i++) {
/* pega a posição de cada linha no array */
JSONObject item = dados.getJSONObject(i);
/* cria um objeto do tipo ClienteModel */
ClienteModel mClienteModel = new ClienteModel();
/* cadastra os dados necessários no objeto mClienteModel */
mClienteModel.set_idrm(Integer.parseInt(item.optString("id")));
mClienteModel.set_nome(item.optString("nome"));
mClienteModel.set_tipo(item.getString("tipo"));
mClienteModel.set_endereco(item.optString("endereco"));
mClienteModel.set_numero(item.optString("numero"));
mClienteModel.set_complemento(item.optString("complemento"));
mClienteModel.set_cep(item.optString("cep"));
mClienteModel.set_bairro(item.optString("bairro"));
mClienteModel.set_cidade(item.optString("cidade"));
mClienteModel.set_estado(item.optString("estado"));
mClienteModel.set_informacao_adicional("informacao_adicional");
/* adicionar o objeto mClienteModel no array de Clientes "arrayClientes" */
this.arrayClientes.add(mClienteModel);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这是ClientsModel:
public class ClienteModel {
private int _id;
private int _idrm;
private String _nome;
private String _tipo;
private String _endereco;
private String _numero;
private String _complemento;
private String _cep;
private String _bairro;
private String _cidade;
private String _estado;
private String _informacao_adicional;
public ClienteModel() {}
public ClienteModel(String _nome, String _tipo, String _endereco, String _numero, String _complemento, String _cep, String _bairro, String _cidade, String _estado, String _informacao_adicional) {
this._nome = _nome;
this._tipo = _tipo;
this._endereco = _endereco;
this._numero = _numero;
this._complemento = _complemento;
this._cep = _cep;
this._bairro = _bairro;
this._cidade = _cidade;
this._estado = _estado;
this._informacao_adicional = _informacao_adicional;
}
public ClienteModel(int _idrm, String _nome, String _tipo, String _endereco, String _numero, String _complemento, String _cep, String _bairro, String _cidade, String _estado, String _informacao_adicional) {
this._idrm = _idrm;
this._nome = _nome;
this._tipo = _tipo;
this._endereco = _endereco;
this._numero = _numero;
this._complemento = _complemento;
this._cep = _cep;
this._bairro = _bairro;
this._cidade = _cidade;
this._estado = _estado;
this._informacao_adicional = _informacao_adicional;
}
public ClienteModel(int _id, int _idrm, String _nome, String _tipo, String _endereco, String _numero, String _complemento, String _cep, String _bairro, String _cidade, String _estado, String _informacao_adicional) {
this._id = _id;
this._idrm = _idrm;
this._nome = _nome;
this._tipo = _tipo;
this._endereco = _endereco;
this._numero = _numero;
this._complemento = _complemento;
this._cep = _cep;
this._bairro = _bairro;
this._cidade = _cidade;
this._estado = _estado;
this._informacao_adicional = _informacao_adicional;
}
public int get_id() {
return _id;
}
public void set_id(int _id) {
this._id = _id;
}
public int get_idrm() {
return _idrm;
}
public void set_idrm(int _idrm) {
this._idrm = _idrm;
}
public String get_nome() {
return _nome;
}
public void set_nome(String _nome) {
this._nome = _nome;
}
public String get_tipo() {
return _tipo;
}
public void set_tipo(String _tipo) {
this._tipo = _tipo;
}
public String get_endereco() {
return _endereco;
}
public void set_endereco(String _endereco) {
this._endereco = _endereco;
}
public String get_numero() {
return _numero;
}
public void set_numero(String _numero) {
this._numero = _numero;
}
public String get_complemento() {
return _complemento;
}
public void set_complemento(String _complemento) {
this._complemento = _complemento;
}
public String get_cep() {
return _cep;
}
public void set_cep(String _cep) {
this._cep = _cep;
}
public String get_bairro() {
return _bairro;
}
public void set_bairro(String _bairro) {
this._bairro = _bairro;
}
public String get_cidade() {
return _cidade;
}
public void set_cidade(String _cidade) {
this._cidade = _cidade;
}
public String get_estado() {
return _estado;
}
public void set_estado(String _estado) {
this._estado = _estado;
}
public String get_informacao_adicional() {
return _informacao_adicional;
}
public void set_informacao_adicional(String _informacao_adicional) {
this._informacao_adicional = _informacao_adicional;
}
@Override
public String toString() {
return "ClienteModel{" +
"_id=" + _id +
", _idrm=" + _idrm +
", _nome='" + _nome + '\'' +
", _tipo='" + _tipo + '\'' +
", _endereco='" + _endereco + '\'' +
", _numero='" + _numero + '\'' +
", _complemento='" + _complemento + '\'' +
", _cep='" + _cep + '\'' +
", _bairro='" + _bairro + '\'' +
", _cidade='" + _cidade + '\'' +
", _estado='" + _estado + '\'' +
", _informacao_adicional='" + _informacao_adicional + '\'' +
'}';
}
}
答案 0 :(得分:1)
我认为引发了空指针异常,因为在构造函数中你没有正确传递上下文,这是一个假设,因为你没有发布ClientesRest(Context ctx)调用。
我的建议是你从主要活动中调用构造函数,如下所示:
ClientesRest clientesRest = new ClientesRest(getApplicationContext());
答案 1 :(得分:1)
你宣布
private Sincronizar mSincronizar = new Sincronizar(this.ctx);
但此时ctx
为空。它仅在构造函数
ctx = activity;
在构造函数中,您需要延迟mSincronizar
的初始化,直到ctx
不为空:
public SincronizarTask(Context activity) {
ctx = activity;
mSincronizar = new Sincronizar(this.ctx);
}
答案 2 :(得分:0)
您是否在清单文件中添加了这一行?
android:name=".helper.AppController"
这是一个例子。
<application
android:name=".helper.AppController"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
...
/>