2017-11-27 3 views
1

Ich habe eine App, in der ich eine Singleton-Klasse gemacht habe, die AdvertId holen. Aber ich bin nicht in der Lage Application Kontext zu übergeben. Wie überprüfe ich meinen Code und führe mich auch?Konnte Anwendungskontext in der Singleton-Klasse nicht übergeben werden?

Singleton Klassencode: -

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(); 
} 

Berufung Klassencode: -

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 
+0

Wo in Ihrem Code stellen Sie den Kontext ein? 'public AdIdFetcher (Kontext Kontext) { this.context = Kontext; } 'erstellen Sie Objekt von AdIdFetcher mit dem obigen Konstruktor vor dem Aufruf von getOurInstance – Sanjeet

+0

Das ist, was ich – Niraj

+0

an dieser Zeile setzen möchte: - ID_Info = AdvertisingIdClient.getAdvertisingIdInfo (Kontext); – Niraj

Antwort

0

Sie müssen Kontext passieren, während getOurInstance()

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

Aufruf Und nennen dies als,

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

Danke, es hat funktioniert .... – Niraj

0

Keeping Kontext als statisches Feld verursacht Speicherverluste und schlecht ist, sollten Sie nicht tun dass übergeben Sie stattdessen den Kontext in der fetchId-Methode selbst.

public void fetchId(Context context, final AdIdFetcherResult rcb) 
+0

Bitte bearbeiten Sie meinen Code – Niraj

0

Ich denke, Ihre Vorwahl ist in Aktivität oder irgendein Fragment richtig?

  1. Bei Fragment:

    Pass Kontext in "getOurInstance()" wie folgt aus:

    AdIdFetcher.getOurInstance(getActivity()).fetchId(..... 
    ...... 
    
  2. Bei Aktivität:

    Pass Kontext in „getOurInstance () "wie folgt:

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

und in Singletonklasse Pass wie folgt aus:

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

und Problem mit Ihrem Code, Sie bekommen Kontext in Konstruktor aber nie, dass Konstruktor in Aufruf Aktivität genannt.

Verwandte Themen