J'ai une application dans laquelle j'ai créé une classe singleton qui récupère AdvertId. Mais je ne peux pas passer le contexte Application. Comment puis-je faire cela s'il vous plaît vérifier mon code et me guider également?

Code de classe Singleton: -

private static AdIdFetcher ourInstance = null;
public static Context context;
private static String TAG = AdIdFetcher.class.getSimpleName();

interface AdIdFetcherResult {
    void onId(String advertId);
}

public AdIdFetcher(Context context) {
    this.context = context;
}

public static AdIdFetcher getOurInstance() {
    if (ourInstance == null) {
        ourInstance = new AdIdFetcher(context);
    }
    return ourInstance;
}

public void fetchId(final AdIdFetcherResult rcb) {
    AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            AdvertisingIdClient.Info id_Info = null;
            try {
                id_Info = AdvertisingIdClient.getAdvertisingIdInfo(context);
            } catch (IOException | GooglePlayServicesNotAvailableException | GooglePlayServicesRepairableException e) {
                e.printStackTrace();
            }
            String advertId = null;
            try {
                assert id_Info != null;
                advertId = id_Info.getId();
                Log.e(TAG, "Advertisement Id::::" + advertId);

            } catch (NullPointerException e) {
                e.printStackTrace();
            }
            rcb.onId(advertId);
            return advertId;
        }
    };
    task.execute();
}

Code de classe d'appel: -

 AdIdFetcher.getOurInstance().fetchId(new AdIdFetcher.AdIdFetcherResult() {
        @Override
        public void onId(String advertId) {
            Log.e(TAG,"Advert ID:::"+advertId);
        }
    });

Logcat

Caused by: java.lang.NullPointerException: null reference
1
Niraj 27 nov. 2017 à 07:44

3 réponses

Meilleure réponse

Vous devez transmettre le contexte lors de l'appel getOurInstance()

public static AdIdFetcher getOurInstance(Context context) {
    if (ourInstance==null){
        ourInstance=new AdIdFetcher(context);
    }
    return ourInstance;
}

Et appelez ça comme,

AdIdFetcher.getOurInstance(context).fetchId(new AdIdFetcher.AdIdFetcherResult() {
        @Override
        public void onId(String advertId) {
            Log.e(TAG,"Advert ID:::"+advertId);
        }
});
0
Kuls 27 nov. 2017 à 04:51

Garder le contexte en tant que champ statique provoque des fuites de mémoire et est mauvais, vous ne devriez pas faire cela, passez plutôt le contexte dans la méthode fetchId elle-même.

public void fetchId(Context context, final AdIdFetcherResult rcb)
0
Sid G 27 nov. 2017 à 12:11

Je pense que votre code d'appel est en activité ou dans un fragment, non?

  1. En cas de fragment:

    passez le contexte dans "getOurInstance ()" comme ceci:

    AdIdFetcher.getOurInstance(getActivity()).fetchId(.....
    ......
    
  2. En cas d'activité:

    passez le contexte dans "getOurInstance ()" comme ceci:

    AdIdFetcher.getOurInstance(classname.this).fetchId(.....
    ......
    

Et en classe singleton, passez comme ceci:

public static AdIdFetcher getOurInstance(Context context) {
  if (ourInstance==null){
    ourInstance=new AdIdFetcher(context);
  }
  return ourInstance;
}

Et le problème avec votre code est que vous obtenez le contexte dans le constructeur mais que vous n'avez jamais appelé ce constructeur lors de l'appel de l'activité.

0
Ankit Patidar 27 nov. 2017 à 05:08
47504094