Android: Application crash quand il atteint AlertDialog.Générateur de rapports à l'aide de la méthode Post
Je vais avoir des problèmes pour obtenir une alerte dans mon application android avec le texte approprié. J'utilise le même code pour l'envoi de la requête Get pour les serveurs et il fonctionne très bien, mais dans ce cas je suis à l'aide de la méthode Post et alors que les données que j'ai envoyer est stocké dans la base de données et Logcat montre qu'un bon/chaîne attendue, l'application se bloque lorsqu'il arrive à onPostExecute partie à la place de l'affichage de l'alerte.
J'ai loupé quelque chose, est-il un autre moyen de traiter les réponses à partir de la méthode Post?
Voici mon code:
package com.example.aplikacija;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.text.Html;
import android.util.Log;
public class REST_VpisOcene extends AsyncTask<Void, Void, String> {
String restURL = "*REST IP removed*";
private Activity activity;
private String predmet;
private String ocena;
private String IDucenca;
private String IDprofesorja;
public REST_VpisOcene(String predmet, String ocena, String IDucenca, String IDprofesorja,
Activity activity) {
this.predmet = predmet;
this.ocena = ocena;
this.IDucenca = IDucenca;
this.IDprofesorja = IDprofesorja;
this.activity = activity;
}
protected String getASCIIContentFromEntity(HttpEntity entity)
throws IllegalStateException, IOException {
InputStream in = entity.getContent();
StringBuffer out = new StringBuffer();
int n = 1;
while (n > 0) {
byte[] b = new byte[4096];
n = in.read(b);
if (n > 0)
out.append(new String(b, 0, n));
}
return out.toString();
}
@Override
protected String doInBackground(Void... params) {
String sporocilo = "";
HttpClient httpclient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost httppost = new HttpPost(restURL);
httppost.addHeader("Accept", "text/html");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs
.add(new BasicNameValuePair("predmet", predmet));
nameValuePairs.add(new BasicNameValuePair("ocena", ocena));
nameValuePairs.add(new BasicNameValuePair("IDucenca", IDucenca));
nameValuePairs.add(new BasicNameValuePair("IDprofesorja", IDprofesorja));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost, localContext);
HttpEntity entity = response.getEntity();
sporocilo = getASCIIContentFromEntity(entity);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Log.i("odgovor vpisa", sporocilo);
return sporocilo;
}
protected void onPostExecute(String results) {
if (results.equals("0")) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Pri vpisu je prišlo do napake!")
.setCancelable(false)
.setNegativeButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
} else if (results.equals("1")) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage("Vpisano!")
.setCancelable(false)
.setNegativeButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
}
Et mon Logcat:
02-08 14:56:11.856: I/odgovor vpisa(6424): 1
02-08 14:56:11.859: D/AndroidRuntime(6424): Shutting down VM
02-08 14:56:11.860: E/AndroidRuntime(6424): FATAL EXCEPTION: main
02-08 14:56:11.860: E/AndroidRuntime(6424): Process: com.example.aplikacija, PID: 6424
02-08 14:56:11.860: E/AndroidRuntime(6424): java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
02-08 14:56:11.860: E/AndroidRuntime(6424): at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:154)
02-08 14:56:11.860: E/AndroidRuntime(6424): at android.app.AlertDialog$Builder.<init>(AlertDialog.java:379)
02-08 14:56:11.860: E/AndroidRuntime(6424): at com.example.aplikacija.REST_VpisOcene.onPostExecute(REST_VpisOcene.java:121)
02-08 14:56:11.860: E/AndroidRuntime(6424): at com.example.aplikacija.REST_VpisOcene.onPostExecute(REST_VpisOcene.java:1)
02-08 14:56:11.860: E/AndroidRuntime(6424): at android.os.AsyncTask.finish(AsyncTask.java:632)
02-08 14:56:11.860: E/AndroidRuntime(6424): at android.os.AsyncTask.access$600(AsyncTask.java:177)
02-08 14:56:11.860: E/AndroidRuntime(6424): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
02-08 14:56:11.860: E/AndroidRuntime(6424): at android.os.Handler.dispatchMessage(Handler.java:102)
02-08 14:56:11.860: E/AndroidRuntime(6424): at android.os.Looper.loop(Looper.java:135)
02-08 14:56:11.860: E/AndroidRuntime(6424): at android.app.ActivityThread.main(ActivityThread.java:5221)
02-08 14:56:11.860: E/AndroidRuntime(6424): at java.lang.reflect.Method.invoke(Native Method)
02-08 14:56:11.860: E/AndroidRuntime(6424): at java.lang.reflect.Method.invoke(Method.java:372)
02-08 14:56:11.860: E/AndroidRuntime(6424): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
02-08 14:56:11.860: E/AndroidRuntime(6424): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Il échoue sur la ligne 121, qui est le
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
dans la seconde si la clause en ce sens qu'elle obtient grâce à la
results.equals("1")
vérifier, avant qu'il ne tombe en panne.
Merci.
OriginalL'auteur bacje16 | 2015-02-08
Vous devez vous connecter pour publier un commentaire.
Le problème est qu'il n'est pas garanti que l'activité est présente au moment de la
onPostExecute()
est appelé.onPostExecute()
est la méthode qui est appelée après l'exécution d'un thread d'arrière-plan est terminé, quel que soit le cycle de vie de l'Activité.La solution est de vérifier si l'activité est présent à l'époque et ensuite exécuter le but de la logique.
Vous pouvez voir cette pour une description plus détaillée de la réponse (la situation est différente, mais toutes deux liées à la question centrale que vous avez ici). Il y a aussi un post de blog qui définit ce sujet dans les détails ce qui est disponible ici.
OriginalL'auteur Avsector
Un an plus tard, mais si quelqu'un d'autre a ce problème peut-être que cette solution peut vous aider.
Lorsque l'activité va afficher la boîte de dialogue ou de n'importe quelle action qui a besoin du contexte d'activité, il est important de vérifier avant si l'activité est visible ou non.
Pour ce faire, vous aurez besoin d'une classe qui étend la classe de l'Application:
Dans votre classe MainActivity, vous devez vous inscrire à l'état actuel de l'application lorsque certaines de ces actions est fait:
Et enfin, avant de faire certaines actions comme par exemple afficher la boîte de dialogue, il suffit de vérifier si l'application est visible:
Avoir une belle journée! 🙂
OriginalL'auteur j_gonfer
changement
private Activity context;
àprivate Context context
et
ou de l'utilisation getcontexteapplication() à la place de contexte et aussi voir cette Question
OriginalL'auteur Xar E Ahmer