Longueur maximale d'Intention putExtra méthode? (Force close)
J'ai besoin d'aide avec le débogage mon application. Tout d'abord: Dans l'émulateur et sur certains autres appareils mon application est en cours d'exécution fine. Sur mon appareil, j'ai un force close (sans forcer la fermeture de message).
Le "crash" qui se passe si l'Activité de l'application est modifié.
Voici du code de la MainActivity
classe. Il se contente de lire le contenu html d'une page web en plus de webview. Et non, il n'est PAS possible de le faire via le HttpRequest
parce que je n'étais pas capable de simuler la requête post.
public class MainActivity extends Activity {
public final static String EXTRA_HTML = "com.example.com.test.HTML";
private WebView mWebView;
private ProgressDialog mDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.webView1);
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeAllCookie();
mWebView.setBackgroundColor(0);
mWebView.setWebChromeClient(new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cmsg) {
if (cmsg.message().startsWith("MAGIC")) {
mDialog.cancel();
/*HashMap<String, String> message = new HashMap<String, String>();*/
String msg = cmsg.message().substring(5);
Intent intent = new Intent(MainActivity.this,
ReadDataActivity.class);
/*message.put("message", msg);*/
/*intent.putExtra(EXTRA_HTML, message);*/
intent.putExtra(EXTRA_HTML, msg);
startActivity(intent);
}
return false;
}
});
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginState(PluginState.OFF);
mWebView.getSettings().setLoadsImagesAutomatically(false);
mWebView.getSettings().setBlockNetworkImage(true);
mWebView.getSettings().setAppCacheEnabled(true);
mWebView.getSettings().setSavePassword(true);
mWebView.getSettings()
.setCacheMode(WebSettings.LOAD_NORMAL);
mWebView.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String address) {
if (address.indexOf("mySession") != -1) {
view.loadUrl("javascript:console.log('MAGIC'+document.getElementsByTagName('html')[0].innerHTML);");
}
});
mWebView.loadUrl("http://www.myurl.de");
}
Donc, dans le onConsoleMessage()
méthode que je viens de passer le code html à une autre classe d'Activité qui lire, analyser et afficher le contenu.
Le problème est qu'à ce moment, quand les ReadDataActivity
classe devrait être chargé de l'application il suffit de fermer et revenir à l'écran d'accueil sans un message ou d'une boîte de dialogue utilisateur.
Est-il possible que le code html qui est passé comme une chaîne de caractères à la ReadDataActivity
est grand? J'ai aussi essayer d'ajouter le code html comme une chaîne de caractères dans une table de hachage, mais le problème est le même.
Quelques idées de ce que je peux faire pour déboguer le problème? Je devrais peut-être essayer de créer un Parcelable
objet?
Dans l'émulateur tout fonctionne bien.
- N'utilisez pas l'intention de / des colis pour le big data. L'enregistrer dans un fichier et l'envoyer un lien vers le fichier.
Vous devez vous connecter pour publier un commentaire.
Selon mon expérience (il y a quelque temps), vous êtes en mesure de mettre à 1 MO de données dans un
Bundle
encapsulé à l'intérieur deIntent
. Je pense que, cette restriction est valable jusqu'à Froyo ou pain d'épice.Toutefois, afin de surmonter ce problème, je vous suggère de sauvegarder votre contenu sur un fichier temp et passer le chemin/URI de votre fichier temp pour votre deuxième activité. Ensuite, dans votre deuxième activité, lire le contenu du fichier, effectuez votre opération souhaitée et enfin supprimer ce fichier.
Si vous le souhaitez, vous pouvez également intégrer des Shared_Preferences pour cette tâche - si vous penser à la manipulation des fichiers est lourd.
J'ai fait quelques recherches sur la quantité maximale de données que vous pouvez transférer à l'aide d'une Intention. Et il semble que la limite est nulle part près de 1 MO ou 90KB, c'est plus comme 500KB (testé sur les API 10, 16, 19 et 23).
J'ai écrit un post de blog sur ce sujet, vous pouvez le trouver ici: https://www.neotechsoftware.com/blog/android-intent-size-limit
La limite de taille d'Intention est encore assez faible dans Jelly Bean, qui est un peu inférieur à 1 MO (environ 90K), de sorte que vous devez toujours être prudent au sujet de votre longueur de données, même si votre application ne ciblent que les dernières versions d'Android.
La taille fixe de 1 MO n'est pas limité aux seules intentions. Comme les Intentions, les Fournisseurs de Contenu, Messenger, tous les services de système comme le Téléphone, Vibrateur, etc. utiliser de la CIB fournisseur d'infrastructure par Binder. En outre, l'activité du cycle de vie des rappels également l'utilisation de ces infrastructures.
1 MO est la limite globale de tous les liant des transactions exécutées dans le système à un moment particulier.
Dans le cas où il y a beaucoup de transactions qui se passe lorsque l'intention est envoyé,il peut échouer même si des données supplémentaires n'est pas grande.
http://codetheory.in/an-overview-of-android-binder-framework/
Un peu tard pour le jeu, mais j'ai juste couru contre le même problème. Écrit les données dans un fichier n'a pas vraiment le sens de la performance-sage dans mon cas, mais je suis tombé sur ceci dans ma recherche de réponses:
http://developer.android.com/guide/faq/framework.html#3
À l'aide d'un singleton est mieux pour moi car il n'y a pas besoin d'e /s de disque. De meilleures performances si les données n'a pas besoin d'être conservé.
Voici un exemple de mise en œuvre:
Puis vous pouvez définir à l'aide de cette dans une activité:
Et le faire dans l'autre activité de ce genre:
J'ai vu que par l'écriture et la lecture à partir d'un fichier se compose de moins de performance .
Puis j'ai vu cette solution : . Je suis donc à l'aide de cette solution :
Puis dans MainActivity je l'ai appelé comme le suivant :
et dans DetailActivity
Une solution alternative pour la transmission de données de grande taille entre les activités est d'utiliser un champ statique. Dans votre cas, ajoutez cette ligne à ReadDataActivity classe
Ensuite, vous pouvez utiliser le champ statique msg dans MainActivity classe comme suit
Et enfin de démarrer votre activité sans mettre
Le Liant de la transaction de la mémoire tampon a une limite de taille fixe - 1 mo.
Mais le problème est que de la mémoire tampon partagée par l'ensemble des transactions en cours pour le processus.
Donc, essayez de garder votre intention de données aussi petite que possible à chaque fois.
L'utilisation de
static String
variable est bon. Si il y a un besoin pour l'utilisateur de revenir & retours entre les différents morceaux de code HTML, vous pouvez également utiliserLruCache
comme ceci:Puis sur le
ReadDataActivity
côtéCette idée est venue de ici.