2017-01-27 3 views
-1

Je travaille sur un projet où je dois démarrer une activité dans une bibliothèque Android à partir de MainActivity dans le module normal d'application.Android - NullPointerEx. causé par getPackageName() de la bibliothèque Android Class

Le MainActivity ressemble à ceci:

public class MainActivity extends ActionBarActivity implements BackendResponse { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

// Here I start an AsyncTask 
public void tellJoke(View view) { 
    BackendConnector backendConnector = new BackendConnector(); 
    backendConnector.execute(); 
} 

// And here is the Callback 
@Override 
public void response(String joke) { 
    /* 
     Down here is the problematic line (PresenterActivity is imported) 
    */ 
    Intent jokeIntent = new Intent(this, PresenterActivity.class); // <--- line 18 
    if (joke == null) joke = getString(R.string.emergency_joke); 

    jokeIntent.putExtra(getString(R.string.intent_key), joke); 

    startActivity(jokeIntent); 
} 

Dans le module la dépendance fichier de build.gradle de la 'application' est définie

android { 
    // compileSdkVersion etc 
} 
dependency { 
    compile project(':jokepresenter') // <--- 
} 

Et dans le settings.gradle fichier de l'ensemble du projet de la bibliothèque est incluse

include ':app', ':jokepresenter' 

Le Logcat dit comme suit:

FATAL EXCEPTION: main 
    Process: com.udacity.gradle.builditbigger, PID: 2723 
    java.lang.NullPointerException: 
    Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
    // ... 
    at com.udacity.gradle.builditbigger.MainActivity.response(MainActivity.java:18) 
    at com.udacity.gradle.builditbigger.BackendConnector.onPostExecute(BackendConnector.java:53) 
    at com.udacity.gradle.builditbigger.BackendConnector.onPostExecute(BackendConnector.java:17) 
    // ... 
+0

Pourriez-vous peut-être ** ** dire pourquoi vous downvote la question? Peut-être que nous pourrions résoudre le problème? –

+0

essayez MainActivity.this ou getContext() au lieu de seulement cela dans l'intention –

+0

MainActivity.this donne la même erreur. Et je ne peux pas appeler _getContext() _, seulement _getBaseContext() _ et _getApplicationContext() _ (et il y a la même erreur aussi) –

Répondre

0

Ok je l'ai.

Le problème était la méthode de rappel ou d'être plus spécifique à l'intérieur de la tâche asynchrone.

@Override 
protected void onPostExecute(String joke) { 
    response = new MainActivity(); // <--- ¯\_(ツ)_/¯ 
    response.response(joke); 
} 

Parce que je créé une nouvelle MainActivity il n'y avait pas de contexte représenté par cette:

Intent jokeIntent = new Intent(this, PresenterActivity.class); 

qui conduisent à une NullPointerException à l'intérieur du ContextWrapper quand il a essayé d'appeler

return mBase.getPackageName(); 

MBASE a été défini comme le contexte d'activité qui a été bien sûr null