Je travaille avec Android application pour afficher une erreur réseau.
NetErrorPage.Java
package exp.app;
import Android.app.Activity;
import Android.app.AlertDialog;
import Android.content.Context;
import Android.content.DialogInterface;
import Android.content.Intent;
import Android.net.ConnectivityManager;
import Android.net.NetworkInfo;
import Android.os.Bundle;
import Android.view.KeyEvent;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
public class NetErrorPage extends Activity implements OnClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.neterrorlayout);
Button reload=(Button)findViewById(R.id.btnReload);
reload.setOnClickListener(this);
showInfoMessageDialog("Please check your network connection","Network Alert");
}
public void onClick(View arg0)
{
if(isNetworkAvailable())
{
Intent myIntent = new Intent((Activity)NetErrorPage.this, MainActivity.class);
myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
((Activity)NetErrorPage.this).startActivity(myIntent);
finish();
}
else
showInfoMessageDialog("Please check your network connection","Network Alert");
}
public void showInfoMessageDialog(String message,String title)
{
AlertDialog alertDialog = new AlertDialog.Builder(NetErrorPage.this).create();
alertDialog.setTitle("Network Alert");
alertDialog.setMessage(message);
alertDialog.setButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which)
{
dialog.cancel();
}
});
alertDialog.show();
}
private boolean isNetworkAvailable()
{
NetworkInfo ActiveNetwork;
@SuppressWarnings("unused")
String IsNetworkConnected;
@SuppressWarnings("unused")
String ConnectionType;
ConnectivityManager connectivitymanager;
connectivitymanager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
try
{
ActiveNetwork=connectivitymanager.getActiveNetworkInfo();
ConnectionType=ActiveNetwork.getTypeName();
IsNetworkConnected=String.valueOf(ActiveNetwork.getState());
return true;
}
catch(Exception error)
{
return false;
}
}
}
mais je reçois l'erreur comme ci-dessous,
08-17 11:59:08.019: E/WindowManager(16460): Activity exp.app.NetErrorPage has leaked window com.Android.internal.policy.impl.PhoneWindow$DecorView@40534a18 that was originally added here
08-17 11:59:08.019: E/WindowManager(16460): Android.view.WindowLeaked: Activity exp.app.NetErrorPage has leaked window com.Android.internal.policy.impl.PhoneWindow$DecorView@40534a18 that was originally added here
08-17 11:59:08.019: E/WindowManager(16460): at Android.view.ViewRoot.<init>(ViewRoot.Java:263)
08-17 11:59:08.019: E/WindowManager(16460): at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:148)
08-17 11:59:08.019: E/WindowManager(16460): at Android.view.WindowManagerImpl.addView(WindowManagerImpl.Java:91)
08-17 11:59:08.019: E/WindowManager(16460): at Android.view.Window$LocalWindowManager.addView(Window.Java:424)
08-17 11:59:08.019: E/WindowManager(16460): at Android.app.Dialog.show(Dialog.Java:241)
08-17 11:59:08.019: E/WindowManager(16460): at sync.directtrac.NetError.showInfoMessageDialog(NetErrorPage.Java:114)
08-17 11:59:08.019: E/WindowManager(16460): at sync.directtrac.NetError.onCreate(NetErrorPage.Java:26)
08-17 11:59:08.019: E/WindowManager(16460): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1047)
08-17 11:59:08.019: E/WindowManager(16460): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1615)
08-17 11:59:08.019: E/WindowManager(16460): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1667)
08-17 11:59:08.019: E/WindowManager(16460): at Android.app.ActivityThread.access$1500(ActivityThread.Java:117)
08-17 11:59:08.019: E/WindowManager(16460): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:935)
08-17 11:59:08.019: E/WindowManager(16460): at Android.os.Handler.dispatchMessage(Handler.Java:99)
08-17 11:59:08.019: E/WindowManager(16460): at Android.os.Looper.loop(Looper.Java:130)
08-17 11:59:08.019: E/WindowManager(16460): at Android.app.ActivityThread.main(ActivityThread.Java:3687)
08-17 11:59:08.019: E/WindowManager(16460): at Java.lang.reflect.Method.invokeNative(Native Method)
08-17 11:59:08.019: E/WindowManager(16460): at Java.lang.reflect.Method.invoke(Method.Java:507)
08-17 11:59:08.019: E/WindowManager(16460): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:867)
08-17 11:59:08.019: E/WindowManager(16460): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:625)
08-17 11:59:08.019: E/WindowManager(16460): at dalvik.system.NativeStart.main(Native Method)
J'ai cherché plus ... mais je n'ai aucune bonne idée pour effacer ceci.
Ce que je veux, c’est que lors du chargement de cette page, la mise en page soit ajoutée et que la boîte de dialogue apparaisse.
S'il vous plaît aidez-moi à effacer cette erreur
Note: J'ai essayé aussi
@Override
protected void onResume() {
super.onResume();
runOnUiThread(new Runnable() {
public void run() {
showInfoMessageDialog("Please check your network connection","Network Alert");
}
});
}
Merci les gars de me donner beaucoup de suggestions. Enfin j'ai une solution. C'est-à-dire que j'ai lancé l'intention de NetErrorPage à deux reprises. Une fois, j’ai vérifié la disponibilité de la connexion Internet et lancé l’intention dans la page. deuxième fois, si la page a une erreur, alors j'ai commencé l'intention dans l'événement OnReceivedError. Ainsi, la première boîte de dialogue n'est pas fermée, avant que la deuxième boîte de dialogue soit appelée. Alors que j'ai eu une erreur.
Raison de l'erreur: J'ai appelé la méthode showInfoMessageDialog deux fois avant de fermer la première.
Maintenant, j'ai supprimé le deuxième appel et effacé l'erreur :-).
Remplacez ce dialog.cancel();
par dialog.dismiss();
La solution consiste à appeler dismiss()
sur le Dialog
que vous avez créé dans NetErrorPage.Java:114 avant de quitter le Activity
, par exemple. dans onPause()
.
Les vues font référence à leur parent Context
(pris à partir de l'argument constructeur). Si vous laissez un Activity
sans détruire Dialog
s et d'autres View
s créés dynamiquement, ils conservent toujours cette référence à votre Activity
(si vous avez créé avec ceci comme Context
: comme new ProgressDialog(this)
), il ne peut donc pas être collecté par le CPG, ce qui provoquerait une fuite de mémoire.
Dans mon cas, finish()
est exécuté immédiatement après l'affichage d'un dialogue.
S'il vous plaît essayer de cette façon et laissez-moi savoir:
Context mContext;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.neterrorlayout);
mContext=NetErrorPage.this;
Button reload=(Button)findViewById(R.id.btnReload);
reload.setOnClickListener(this);
showInfoMessageDialog("Please check your network connection","Network Alert");
}
public void showInfoMessageDialog(String message,String title)
{
new AlertDialog.Builder(mContext)
.setTitle("Network Alert");
.setMessage(message);
.setButton("OK",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which)
{
dialog.cancel();
}
})
.show();
}
La boîte de dialogue ne doit être démarrée qu’après l’initialisation des états de la fenêtre de l’activité. Ceci se produit uniquement après la reprise.
Alors appelez
runOnUIthread(new Runnable(){
showInfoMessageDialog("Please check your network connection","Network Alert");
});
dans votre fonction OnResume. Ne créez pas de boîtes de dialogue dans OnCreate
Edit:
utilisez ceci
Handler h = new Handler();
h.postDelayed(new Runnable(){
showInfoMessageDialog("Please check your network connection","Network Alert");
},500);
dans votre Onresume au lieu de showonuithread
@Override
protected void onPostExecute(final Boolean success) {
mProgressDialog.dismiss();
mProgressDialog = null;
définir la valeur null fonctionne pour moi
J'ai eu cette erreur mais c'est résolu intéressant. Comme tout d’abord, j’ai eu cette erreur au niveau de l’API 17. Quand j’appelle un fil (AsyncTask ou autres) sans boîte de dialogue de progression, j’appelle de nouveau une méthode de fil à l’aide de la boîte de dialogue de progression. .
Dans mon cas, il y a deux résultats:
show();
méthode de dialogue de progression avant le premier thread puis j'ai pris dismiss();
méthode de dialogue de progression avant la fin du dernier thread.Alors :
ProgresDialog progressDialog = new ...
//configure progressDialog
progressDialog.show();
start firstThread {
...
}
...
start lastThread {
...
}
//be sure to finish threads
progressDialog.dismiss();