自定义Volley Singleton会抛出NullPointerException吗?

时间:2015-03-04 22:58:07

标签: android android-volley

我有一个应用程序,我正在使用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)

1 个答案:

答案 0 :(得分:0)

解决了这个问题。

我在AndroidManifest中的标记android:name="<package>.CustomVolleySingleton2" android:allowBackup="true"上添加了此<application>。现在工作正常。