दिलचस्प पोस्ट
एक्सटेंशन प्रकारों के संकलन में संगतता की जांच करना, और उन्हें सीडीएफ़ के साथ प्रयोग करना द्विपदीय फाइलों के साथ एक गिट संघर्ष का समाधान करना एसडीके टूल में एंड्रॉइड एमुलेटर शुरू करने, 12 संशोधन आईई फ़ाइल डाउनलोड सुरक्षा नियमों के आसपास क्या तकनीकें हैं? ओपन UITableView एडिट बटन को प्रोग्रामेटिक रूप से खोलें पायथन में "कुछ नहीं" पर stdout पुनर्निर्देशित करना MongoDB के साथ सरणी से विशिष्ट आइटम निकाल रहा है सर्वर साइड पर जनरेटेड गतिशील सामग्री को कैप्चर करें एक्सेल ओपन एक्सएमएल पढ़ना खाली कोशिकाओं की अनदेखी कर रहा है कोणीय / आरएक्सजेएस जब मैं `सदस्यता 'से सदस्यता समाप्त करना चाहिए Django डाउनलोड करने योग्य फ़ाइलें प्रदान करने के बाद UICollectionView: चयन पर सेल आकार परिवर्तन चेतन जावा में XML पार्सिंग के लिए सबसे अच्छा पुस्तकालय कौन सा है सभी इंस्टॉल किए गए ऐप्स की सूची प्राप्त करें जावा में पार्सिंग सीएसवी

Intent putExtra विधि की अधिकतम लंबाई? (किसी भी तरह बंद करें)

मुझे अपने आवेदन को डिबग करने में कुछ मदद की आवश्यकता है सबसे पहले: एमुलेटर में और कुछ अन्य उपकरणों पर मेरा ऐप ठीक चल रहा है मेरे डिवाइस पर मुझे बल मिला (एक बल बंद संदेश के बिना) मिला।

"क्रैश" तब होता है जब ऐप की गतिविधि बदल जाती है।

यहां मुख्य MainActivity वर्ग का कुछ कोड है यह वेबवेब पर वेब पेज से सिर्फ HTML सामग्री पढ़ता है और नहीं, यह HttpRequest पर ऐसा करना संभव नहीं है क्योंकि मैं पोस्ट का अनुरोध अनुकरण करने में सक्षम नहीं था।

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

इसलिए, onConsoleMessage() विधि में मैं HTML कोड को किसी अन्य एक्टिविटी कक्षा में पास करता हूं जो सामग्री को पढ़, पार्स और प्रदर्शित करता है।

समस्या यह है कि इस बिंदु पर जब ReadDataActivity वर्ग को एप्लिकेशन को अभी बंद किया जाना चाहिए और किसी भी संदेश या उपयोगकर्ता संवाद के बिना होम स्क्रीन पर वापस जाना चाहिए

क्या यह संभव है कि ReadDataActivity को स्ट्रिंग के रूप में पारित किया जाने वाला HTML कोड बड़ा है? मैं भी हैशमैप में एक स्ट्रिंग के रूप में html कोड को जोड़ने का प्रयास करता हूं लेकिन समस्या एक समान है।

कुछ विचार मैं समस्या को डीबग करने के लिए क्या कर सकता हूँ? शायद मुझे Parcelable वस्तु बनाने का प्रयास करना चाहिए?

एमुलेटर में सब कुछ ठीक काम कर रहा है

सादर, सैंड्रो

वेब के समाधान से एकत्रित समाधान "Intent putExtra विधि की अधिकतम लंबाई? (किसी भी तरह बंद करें)"

मेरे अनुभव (कुछ समय पहले) के अनुसार, आप Intent भीतर एक Bundle समेकित 1 एमबी डेटा तक पहुंच सकते हैं। मुझे लगता है, यह प्रतिबंध Froyo या जिंजरब्रेड तक वैध था।

हालांकि, इस मुद्दे पर काबू पाने के लिए, मैं आपको अपनी सामग्री को एक टेम्पलेट फ़ाइल पर सहेजने और अपनी दूसरी गतिविधि के पथ / यूआरआई को अपने अस्थायी फाइल में रखने का सुझाव देता हूं। फिर अपनी दूसरी गतिविधि में, सामग्री से फ़ाइल को बाहर निकालें, अपना वांछित ऑपरेशन करें और आखिरकार उस फ़ाइल को हटा दें

यदि आप चाहें, तो आप इस कार्य के लिए Shared_Preferences को भी शामिल कर सकते हैं – अगर आपको लगता है कि फ़ाइलों को संभालने में बोझिल है

मैंने आपके द्वारा किसी आशय का उपयोग करके अधिकतम मात्रा में डेटा स्थानांतरित कर सकते हैं। और ऐसा लगता है कि सीमा 1 एमबी या 90 केबी के पास कहीं भी नहीं है, यह 500KB की तरह अधिक है (एपीआई 10, 16, 1 9 और 23 पर परीक्षण किया गया है)।

मैंने इस विषय के बारे में एक ब्लॉग पोस्ट लिखा, आप इसे यहां पा सकते हैं: https://www.neotechsoftware.com/blog/android-intent-size-limit

1 एमबी का तय आकार केवल इंटेंट्स तक ही सीमित नहीं है। इंटेंट्स, कंटेंट प्रोवाइडर्स, मेसेंजर, टेलिफोन, व्हाइब्रेटर आदि की तरह सभी सिस्टम सेवाएं आईपीसी इंफ्रास्ट्रक्चर प्रदाता का उपयोग बाइंडर द्वारा करती हैं। इसके अलावा गतिविधि जीवन चक्र कॉलबैक भी इस बुनियादी ढांचा का उपयोग करते हैं।

1 एमबी एक विशेष क्षण पर प्रणाली में निष्पादित सभी बाइंडर लेनदेन पर समग्र सीमा है।

यदि इरादा भेजा जाता है, तो बहुत सारे लेन-देन हो रहे हैं, भले ही अतिरिक्त डेटा बड़ा नहीं हो, हालांकि यह विफल हो सकता है। http://codetheory.in/an-overview-of-android-binder-framework/

आइडेंट की आकार सीमा अभी भी जेली बीन में बहुत कम है, जो 1 एमबी (लगभग 9 0 किमी) से कुछ हद तक कम है, इसलिए आपको हमेशा अपने डेटा की लंबाई के बारे में सावधान रहना चाहिए, भले ही आपका एप्लिकेशन केवल नवीनतम एंड्रॉइड संस्करणों को लक्षित करता है

खेल से थोड़ा देर हो चुकी है, लेकिन मैं एक ही मुद्दे के खिलाफ सिर्फ भाग गया फ़ाइल को डेटा लिखना वास्तव में मेरे मामले में प्रदर्शन-वार नहीं समझता था, लेकिन मैं जवाब के लिए अपनी खोज में आया था:

http://developer.android.com/guide/faq/framework.html#3

सिंगलटन का इस्तेमाल करना मेरे लिए बेहतर है क्योंकि डिस्क आईओ की कोई ज़रूरत नहीं है बेहतर प्रदर्शन अगर डेटा को जारी रखने की आवश्यकता नहीं है।

यहां एक उदाहरण कार्यान्वयन है:

 public class DataResult { private static DataResult instance; private List<SomeObject> data = null; protected DataResult() { } public static DataResult getInstance() { if (instance == null) { instance = new DataResult(); } return instance; } public List<SomeObject> getData() { return data; } public void setData(List<SomeObject> data) { this.data = data; } } 

तो आप इसे एक गतिविधि में प्रयोग कर सकते हैं:

 DataResult.getInstance().setData(data); 

और इसे इस तरह की अन्य गतिविधि में प्राप्त करें:

 List<SomeObject> data = DataResult.getInstance().getData(); 

गतिविधियों के बीच बड़े डेटा को पार करने के लिए एक वैकल्पिक समाधान एक स्थिर क्षेत्र का उपयोग करना है। आपके मामले में इस लाइन को ReadDataActivity वर्ग में जोड़ें

 public static String msg; 

इसके बाद आप मेनैक्टिविटी क्लास के भीतर स्थिर फ़ील्ड संदेश का उपयोग कर सकते हैं

 ReadDataActivity.msg = cmsg.message().substring(5); 

और आखिरकार अतिरिक्त गतिविधि के बिना अपनी गतिविधि शुरू करें

 Intent intent = new Intent(MainActivity.this, ReadDataActivity.class); startActivity(intent); 

मैंने देखा है कि फाइल लिखने और पढ़ने से कम प्रदर्शन होते हैं तो मैंने यह समाधान देखा है: तो मैं इस समाधान का उपयोग कर रहा हूं:

 public class ExtendedDataHolder { private static ExtendedDataHolder ourInstance = new ExtendedDataHolder(); private final Map<String, Object> extras = new HashMap<>(); private ExtendedDataHolder() { } public static ExtendedDataHolder getInstance() { return ourInstance; } public void putExtra(String name, Object object) { extras.put(name, object); } public Object getExtra(String name) { return extras.get(name); } public boolean hasExtra(String name) { return extras.containsKey(name); } public void clear() { extras.clear(); } } 

फिर मुख्य गतिविधि में मैंने इसे निम्नलिखित की तरह कहा है:

 ExtendedDataHolder extras = ExtendedDataHolder.getInstance(); extras.putExtra("extra", new byte[1024 * 1024]); extras.putExtra("other", "hello world"); startActivity(new Intent(MainActivity.this, DetailActivity.class)); 

और विस्तार की गतिविधि में

 ExtendedDataHolder extras = ExtendedDataHolder.getInstance(); if (extras.hasExtra("other")) { String other = (String) extras.getExtra("other"); } 

बाइंडर ट्रांज़ैक्शन बफर का एक सीमित निश्चित आकार है – 1 एमबी लेकिन समस्या यह है कि प्रक्रिया के लिए प्रगति के सभी लेनदेन में बफर साझा किया गया है।

तो अपने इरादे के आंकड़ों को यथासंभव छोटे रूप से हर बार रखने का प्रयास करें।

static String चर का उपयोग अच्छा है। यदि उपयोगकर्ता को एचटीएमएल के विभिन्न टुकड़ों के बीच आगे और पीछे जाने की ज़रूरत है, तो आप इस तरह LruCache उपयोग कर सकते हैं:

  static LruCache<String, String> mMemoryCache; final int kiloByte = 1024; . . final int maxMemoryKB = (int) (Runtime.getRuntime().maxMemory() / kiloByte); // then choose how much you want to allocate for cache final int cacheSizeKB = maxMemoryKB / 8; . . mMemoryCache = new LruCache<String, String>(cacheSizeKB) { //@Override protected int sizeOf(String key, String value) { try { byte[] bytesUtf8 = value.getBytes("UTF-8"); return bytesUtf8.length / kiloByte; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return -1; } }; . . String cacheKey = generateUniqueString(key); if (mMemoryCache.get(key) == null) { mMemoryCache.put(cacheKey, yourContent); } Intent intent = new Intent(getApplicationContext(), ReadDataActivity.class); intent.putExtra(EXTRA_HTML, cacheKey); startActivity(intent); 

फिर ReadDataActivity पक्ष पर

 Intent intent = getIntent(); String cacheKey = intent.getStringExtra(EXTRA_HTML); String contentString = MainActivity.mMemoryCache.get(cacheKey); doSomethingWith(contentString); 

यह विचार यहां से आया था।