我有一个应用程序,我正在使用Volley API。我正在尝试创建一个Volley Singleton来执行我的请求。为此,我创建了一个返回json请求的ApplicationController,但是当我尝试执行此ApplicationController时,Singleton抛出一个NullPointerException,我无法理解为什么会抛出这个。
我正在尝试这个。
的ApplicationController
public class ApplicationController extends Request<JSONObject>{
private Map<String, String> headers;
private Map<String, String> params;
private Response.Listener<JSONObject> listener;
public ApplicationController(String url, Map<String, String> params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(Method.GET, url, errorListener);
this.listener = listener;
this.params = params;
}
public ApplicationController(int method, String url, Map<String, String> params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = listener;
this.params = params;
}
protected Map<String, String> getParams() throws AuthFailureError {
return params;
};
public Map<String, String> getHeaders() throws AuthFailureError {
headers = new HashMap<String, String>();
//String cred = String.format("%s:%s", BasicAuthenticationRest.USERNAME, BasicAuthenticationRest.PASSWORD);
//String auth = "Basic " + Base64.encodeToString(cred.getBytes(), Base64.DEFAULT);
//headers.put("Authorization", auth);
return headers;
};
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
listener.onResponse(response);
}
}
DAO
/** retorna todos os estados */
public ApplicationController getAllEstado(final EstadoAdapter listener){
urlGet.append("/ws/get_estado.php");
Log.i("URL GET ESTADOS->", urlGet.toString());
ApplicationController apc = new ApplicationController(urlGet.toString(),
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject obj) {
Log.i("RETORNO ESTADO ->", obj.toString());
try{
Gson gson = new Gson();
JSONArray array = obj.getJSONArray("Estados");
List<Estado> lista = new ArrayList<Estado>();
if(array.length() > 0){
for(int x = 0; x < array.length(); x++){
JSONObject jsonObject = array.getJSONObject(x);
Estado estado = gson.fromJson(jsonObject.toString(), Estado.class);
lista.add(estado);
}
listener.getAllEstado(lista);
}else{
listener.getAllEstado(lista);
}
}catch (JSONException e) {
Log.e("JSONException->:", "getAllEstado in EstadoDAO: " + e.getLocalizedMessage());
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
Log.e("ERROR METHOD:", "getAllEstado in EstadoDAO: " + arg0.getLocalizedMessage());
}
});
return apc;
}
片段
public class CidadesFrag extends Fragment implements View.OnClickListener, AdapterView.OnItemSelectedListener, AdapterView.OnItemClickListener{
private ProgressDialog progress;
private final String TAG = getClass().getSimpleName() + "->";
//estado
private EstadoListAdapter estadoAdapter;
private Spinner acEstado;
private List<Estado> listaEstado = new ArrayList<Estado>();
private Estado estado;
//cidade
private CidadeListAdapter2 cidadeAdapter;
private AutoCompleteTextView acCidade;
private ArrayList<Cidade> listaCidade = new ArrayList<Cidade>();
private Cidade cidade;
//button
private Button btEntrar;
private Button btLocalizar;
//verifica se ja foi localizado 1x
private static boolean localizado = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.cidades_frag, container, false);
acEstado = (Spinner)view.findViewById(R.id.acEstado);
acEstado.setOnItemSelectedListener(this);
acEstado.requestFocus();
acCidade = (AutoCompleteTextView)view.findViewById(R.id.acCidade);
acCidade.setOnItemClickListener(this);
//btEntrar
btEntrar = (Button)view.findViewById(R.id.btEntrar);
btEntrar.setOnClickListener(this);
btEntrar.setFocusable(true);
btEntrar.setFocusableInTouchMode(true);
btEntrar.requestFocus();
//btLocalizar
btLocalizar = (Button)view.findViewById(R.id.btLocalizar);
btLocalizar.setOnClickListener(this);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getEstados();
}
/** retorna todos os estados */
private void getEstados(){
final ProgressDialog progress = new CustomProgressDialog().getCustomProgress(null, getView().getContext());
progress.setCancelable(false);
progress.show();
ApplicationController app = new EstadoDAO().getAllEstado(new EstadoAdapter(){
@Override
public void getAllEstado(List<Estado> list) {
if(list.size()>0){
listaEstado = list;
estadoAdapter = new EstadoListAdapter(getView().getContext(), list);
acEstado.setAdapter(estadoAdapter);
//verifica se ja foi localizado 1x se nao foi localiza
if(!localizado){
getMyLocation();
localizado = true;
}
}else{
Toast.makeText(getView().getContext(), "Nenhuma informação encontrada", Toast.LENGTH_SHORT).show();
}
progress.dismiss();
}
});
CustomVolleySingleton2.getInstance().addToRequestQueue(app);
}
@Override
public void onClick(View v) {
if(v == btEntrar){
if(checkCidade()){
Bundle params = new Bundle();
cidade.setEstado(estado);
params.putSerializable("cidade", cidade);
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment frag = new LocaisFrag();
frag.setArguments(params);
ft.replace(R.id.fl, frag);
ft.addToBackStack(CustomDrawerLayout.FRAG_TAG);
ft.commit();
}
}else if(v == btLocalizar){
getMyLocation();
}
}
/** verifica se a cidade nao esta nula */
private boolean checkCidade(){
if(cidade != null){
return true;
}else{
Toast.makeText(getView().getContext(), "Digite a cidade", Toast.LENGTH_SHORT).show();
return false;
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if(parent == acEstado){
estado = listaEstado.get(position);
if(estado != null && estado.getId() > 0){
getCidadesEstado(estado.getId());
}
}
}
/** retorna as cidades do estado */
private void getCidadesEstado(int idEstado){
ApplicationController app = new CidadeDAO().getAllCidadesByEstado(idEstado, new CidadeAdapter(){
@Override
public void getAllCidades(List<Cidade> lista) {
if(lista.size() > 0){
listaCidade.addAll(lista);
cidadeAdapter = new CidadeListAdapter2(getView().getContext(), android.R.layout.simple_list_item_1, listaCidade);
acCidade.setAdapter(cidadeAdapter);
acCidade.setThreshold(1);
}else{
Toast.makeText(getView().getContext(), "Nenhuma informação encontrada", Toast.LENGTH_SHORT).show();
acCidade.setText("");
acCidade.clearListSelection();
listaCidade.clear();
cidade = null;
}
}
});
CustomVolleySingleton2.getInstance().addToRequestQueue(app);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
cidade = (Cidade) parent.getAdapter().getItem(position);
Log.i("CIDADE->", cidade.getId() + "");
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_info, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.action_info){
//Toast.makeText(getView().getContext(), "Cliquei", Toast.LENGTH_SHORT).show();
openDialogInfo();
}
return super.onOptionsItemSelected(item);
}
/** abre o dialog para cadastro do local */
private void openDialogInfo(){
LayoutInflater li = LayoutInflater.from(getView().getContext());
final View promptsView = li.inflate(R.layout.info_view, null);
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getView().getContext());
WebView webView = (WebView)promptsView.findViewById(R.id.webview);
webView.loadData(getText(), "text/html; charset=utf-8", null);
alertDialogBuilder.setView(promptsView);
//AlertDialog
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
private String getText(){
StringBuilder builder = new StringBuilder();
builder.append("<html>");
builder.append("<body>");
builder.append("<h3>Bem vindo ao TudoAQ!</h3>");
builder.append("<medium>");
builder.append("<p align=\"justify\">");
builder.append("O TudoAQ! é um aplicativo colaborativo criado com a finalidade " +
"de facilitar a localização em todo o Brasil. " +
"Com o aplicativo você cadastra os locais de sua cidade ou onde quer que você esteja, tornando mais fácil de serem encontrados " +
"por outras pessoas a qualquer momento com a busca inteligente.");
builder.append("</p>");
builder.append("<p align=\"justify\">");
builder.append("A busca inteligente é o mecanismo que faz a pesquisa por nome ou tipo do local que deseja encontrar, " +
"por exemplo, digite \"Pizz\"(Sem Aspas) e você irá encontrar todas as Pizzarias da cidade em que procura.");
builder.append("</p>");
builder.append("<p align=\"justify\">");
builder.append("Cadastre agora sua cidade e os locais que você freqüenta, você estará ajudando " +
"outras pessoas á encontrar o contato mais fácilmente com o TudoAQ!");
builder.append("</p>");
builder.append("</medium>");
builder.append("</body>");
builder.append("</html>");
return builder.toString();
}
/** verifica minha localizacao */
private void getMyLocation(){
progress = new CustomProgressDialog().getCustomProgress("Localizando...", getView().getContext());
progress.show();
GPSTracker gpsTracker = new GPSTracker(getView().getContext());
Location location = new Location("Origem");
location.setLongitude(gpsTracker.getLongitude());
location.setLatitude(gpsTracker.getLatitude());
Log.i("String latitude->", location.getLatitude() + "");
Log.i("String longitude->", location.getLatitude() + "");
List<Cidade> lista = new GetMyLocation().getLocation(getView().getContext(), location.getLatitude(), location.getLongitude());
progress.dismiss();
getMyLocationWS(lista);
}
/** faz a consulta no WS para buscar o codigo da cidade e do estado */
private void getMyLocationWS(List<Cidade> lista){
progress = new CustomProgressDialog().getCustomProgress("Concluindo localização...", getView().getContext());
progress.show();
if(lista != null && lista.size() > 0){
String cidade = lista.get(0).getCidade();
String estado = ReturnStates.getState(lista.get(0).getEstado().getEstado());
ApplicationController app = new CidadeDAO().getIdCidadeAndEstado(cidade, estado, new CidadeAdapter(){
@Override
public void getIdCidadeAndEstado(Cidade cidade) {
if(cidade != null){
setCidade(cidade);
setEstado(cidade.getEstado());
Toast.makeText(getView().getContext(), "Você está em: " + cidade.getCidade() + "/" + cidade.getEstado().getEstado(), Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getView().getContext(), "Não foi possível encontrar sua localização", Toast.LENGTH_SHORT).show();
}
progress.dismiss();
}
});
CustomVolleySingleton2.getInstance().addToRequestQueue(app);
}
}
/** define a cidade vinda do GPS */
private void setCidade(Cidade cid){
this.cidade = cid;
acCidade.setText(this.cidade.getCidade());
}
/** define o estado vindo do GPS */
private void setEstado(Estado est){
this.estado = est;
if(listaEstado.size() > 0){
acEstado.setSelection(listaEstado.indexOf(this.estado));
}
//acEstado.setSelection(this.estado.getId());
}
@Override
public void onPause() {
super.onPause();
if(!listaCidade.isEmpty()){
cidadeAdapter.clearList();
}
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onStop() {
super.onStop();
CustomVolleySingleton2.getInstance().cancelPendingRequests(CustomVolleySingleton2.TAG);
}
}
Volley Singleton
public class CustomVolleySingleton2 extends Application {
public static final String TAG = CustomVolleySingleton2.class.getSimpleName();
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static CustomVolleySingleton2 mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized CustomVolleySingleton2 getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public ImageLoader getImageLoader() {
getRequestQueue();
if (mImageLoader == null) {
mImageLoader = new ImageLoader(this.mRequestQueue,
new LruBitmapCache());
}
return this.mImageLoader;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
// set the default tag if tag is empty
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);
}
}
}
LruBitmapCache
public class LruBitmapCache extends LruCache<String, Bitmap> implements ImageCache {
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public LruBitmapCache() {
this(getDefaultLruCacheSize());
}
public LruBitmapCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
异常
03-04 19:45:09.871 9724-9724/br.com.finderapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: br.com.finderapp, PID: 9724
java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.finderapp/br.com.tudoaq.menu.CustomTabLayout}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.access$900(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at br.com.tudoaq.frags.CidadesFrag.getEstados(CidadesFrag.java:137)
at br.com.tudoaq.frags.CidadesFrag.onActivityCreated(CidadesFrag.java:110)
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1794)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:967)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1189)
at android.app.Activity.performStart(Activity.java:5436)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
at android.app.ActivityThread.access$900(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
解决了这个问题。
我在AndroidManifest中的标记android:name="<package>.CustomVolleySingleton2"
android:allowBackup="true"
上添加了此<application>
。现在工作正常。