2012-10-10 13 views
24

पर बड़ा डेटा पास करना मुझे एक अजीब समस्या है। मैं वेब के चारों ओर देख रहा था लेकिन जवाब नहीं मिला। मैं अभी भी एंड्रॉइड प्रोग्रामिंग में एक नौसिखिया हूँ। तो चलो चलते हैं:समस्या: दूसरी गतिविधि

सभी मुझे क्या करना कुछ डेटा के साथ दूसरे गतिविधि बुला रहा है चाहता हूँ। यह छोटे डेटा के साथ ठीक काम करता है, लेकिन यदि डेटा बड़ा हो जाता है, तो दूसरी गतिविधि नहीं दिखाई देगी और पहला एक खत्म हो जाएगा।

Intent intent = new Intent(ActivitySearch.this,ActivityResults.class); 
Bundle bundle = new Bundle(); 
bundle.putParcelableArrayList("data", searchList); 
intent.putExtras(bundle); 
startActivity(intent); 

डेटा प्राप्त करने के भाग के महत्वपूर्ण नहीं है: यहाँ बुला विधि के अपने कोड है। यहां तक ​​कि अगर मैं बंडल को पढ़ने की कोशिश नहीं करता हूं, तो गतिविधि को नहीं बुलाया जाएगा। मैं निम्नलिखित लाइनों के साथ इस परीक्षण किया है:

@Override 
public void onCreate(Bundle savedInstanceState) { 
Log.d("DEBUG","ActivityResult::onCreate()"); 
super.onCreate(savedInstanceState); 

OnCreate() कभी नहीं कहा जाता हो जाता है।

शायद तुम्हारा से एक एक विचार आया ... आपकी मदद के लिए धन्यवाद!

संपादित करें: कम से कम मैं भूल गया था: यह केवल आईसीएस के तहत होता है। ऐप जिंजरब्रेड और फ्रियो के साथ एक आकर्षक की तरह काम करता है।

EDIT2: Logcat

10-10 14:49:46.951: D/OpenGLRenderer(21696): Flushing caches (mode 0) 
10-10 14:49:47.011: V/ActivityThread(22429): com.example.amazonsearch white listed for hwui 
10-10 14:49:50.821: W/IInputConnectionWrapper(21696): showStatusIcon on inactive InputConnection 
+0

खैर इस मामले में आप LogCat में कुछ स्टैकट्रेस होने किया जाना चाहिए। कृपया कुछ त्रुटि लॉग जांचें और डंप करें। –

+0

ठीक है इसे पोस्ट से जुड़ा हुआ है। इस त्वरित प्रतिक्रिया के लिए धन्यवाद! – sk2andy

+1

और भी होगा। यहां मैं कोई प्रासंगिक जानकारी नहीं देख सकता –

उत्तर

33

(इसके अलावा यह काम करता है बनाने के लिए सही जवाब की जाँच करें) गूगल android guide ने सुझाव दिया रूप में, आप गतिविधियों के बीच डाटा साझा करने के स्थिर क्षेत्रों या एकमात्र इस्तेमाल कर सकते हैं।

वे सलाह देते हैं यह ऐसा लगता है

अपने कोड से "कम अवधि के लिए जटिल गैर लगातार उपयोगकर्ता परिभाषित वस्तुओं साझा करने के लिए" है कि आप वास्तव में क्या जरूरत है।

ActivityResults.data = searchList; 
Intent intent = new Intent(ActivitySearch.this,ActivityResults.class); 
startActivity(intent); 

तो फिर तुम ActivityResults गतिविधि में कहीं से भी एक्सेस कर सकते हैं ActivityResults.data के बाद यह शुरू होता है:

तो ActivitySearch.class में अपने कोड कुछ इस तरह दिखाई सकता है।

उपयोगकर्ता सत्रों के बीच साझा किए जाने वाले डेटा के लिए, स्थिर फ़ील्ड का उपयोग करने की सलाह नहीं दी जाती है, क्योंकि पृष्ठभूमि में ऐप चल रहा है, जबकि एंड्रॉइड फ्रेमवर्क द्वारा एप्लिकेशन प्रक्रिया को मार और पुनरारंभ किया जा सकता है (यदि ढांचे को संसाधनों को मुक्त करने की आवश्यकता है)। ऐसे मामले में सभी स्थैतिक क्षेत्रों को फिर से शुरू किया जाएगा।

+2

क्या होगा यदि आप विभिन्न ऐप्स या प्रक्रियाओं के बीच बड़ा डेटा भेजना चाहते हैं? –

+0

हाँ, टीटीएलई सबसे अधिक संभावना है। समाधान इसके बजाय Serializable का उपयोग करने के रूप में सरल हो सकता है। यहां अधिक जानकारी http://nemanjakovacevic.net/blog/english/2015/03/24/yet-another-post-on-serializable-vs-parcelable/ –

+1

मुझे लगता है कि बड़े अस्थायी डेटा के लिए सिंगलटन कक्षा का उपयोग करने के एंड्रॉइड के सुझाव है जाने का एक शानदार तरीका है। यह वास्तव में त्वरित और सरल रखता है, जहां आपका डेटा कहां है। – mix3d

2

आप अन्य गतिविधि के लिए एक से एक बड़े सूचना पार कर लेते हैं तो यह ऐप धीमी

कर हो सकता है लेकिन का उपयोग कर कि आप आसानी से प्राप्त कर सकते हैं के साथ चर स्टोर करने के लिए वैश्विक कक्षा का उपयोग कर सकते

: या कोई भी मान

कि वैश्विक फ़ाइल में घोषित

इस लिंक को देख सेट

http://androidresearch.wordpress.com/2012/03/22/defining-global-variables-in-android/

+0

ठीक है, यह कामकाज है जिसके बारे में मुझे सोचना है। आपका बहुत बहुत धन्यवाद! – sk2andy

+0

नहीं वास्तव में चारों ओर एक काम है, लेकिन सही कार्यान्वयन मुझे लगता है कि: यदि आप अन्य करने के लिए एक गतिविधि से डेटा की भारी chuncks स्थानांतरण नहीं करना चाहिए। – Teovald

1

जहां तक ​​मुझे याद है, ऊपर एपीआई-8 (Froyo) तक, वहाँ कुछ सीमाएं (1MB) की तरह थे जब उद्देश्य के माध्यम से parcelable वस्तुओं गुजर। हालांकि, आप बस अपने पार्ससेल डेटा को फ़ाइल में लिख सकते हैं और बंडल के माध्यम से अपनी अगली गतिविधि में फ़ाइल पथ भेज सकते हैं। बाद में, फ़ाइल से डेटा पढ़ने और बाद में इसे हटाने के लिए अपनी दूसरी गतिविधि को कोड करें।

+0

शायद, इसके बारे में सोचना है। धन्यवाद! – sk2andy

+0

वैश्विक संदर्भ पर्याप्त लुभावना हैं और एक शॉर्टकट है, लेकिन इसकी बड़ी मात्रा में डेटा के लिए कुछ अनुशंसित नहीं है। – waqaslam

+3

अभी भी एक सीमा आज लॉलीपॉप में, है, और यह 1 एमबी तुलना में काफी छोटा हो सकता है। मैं एक ब्लॉग पोस्ट स्थिति http://nemanjakovacevic.net/blog/english/2015/03/24/yet-another-post-on-serializable-vs-parcelable/ –

0

मुझे नहीं पता कि यह बड़े डेटा के साथ क्यों काम नहीं करता है, लेकिन अगर आपको इसे ठीक करने का कोई तरीका नहीं मिलता है, तो मेरा सुझाव है कि आप कस्टम वैश्विक एप्लिकेशन, like here का उपयोग करें। आप शायद हो रही है TransactionTooLargeException

+0

ठीक है, यह एक के लिए संभव है पर कुछ प्रकाश बहा लिखा था वैकल्पिक हल। मैं ऐसा करने के लिए मानता हूँ। आपका बहुत बहुत धन्यवाद! – sk2andy

23

तरह से मैं बड़े डेटा गुजर पसंद करते हैं enums का उपयोग कर के माध्यम से है। इस दृष्टिकोण के कुछ फायदे:

  • सिंगलेट बनाने की कोई ज़रूरत नहीं है, आपके पास हमेशा आपके enum का एक उदाहरण होता है;
  • डाटा को ठीक से समझाया जाता है;
  • संदर्भ नष्ट कर दिया सही होने के बाद गतिविधि यह

प्राप्त करता है यहाँ एक उदाहरण है:

package com.jyvee.arguments; 

import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 

public class SomeActivity extends Activity { 

    // Names for the arguments we pass to the 
    // activity when we create it 
    private final static String ARG_STRING = "ARG_STRING"; 
    private final static String ARG_INT = "ARG_INT"; 

    private String stringField; 
    private int intField; 
    private List<Object> arrayField; 

    private enum DataHolder { 
     INSTANCE; 

     private List<Object> mObjectList; 

     public static boolean hasData() { 
      return INSTANCE.mObjectList != null; 
     } 

     public static void setData(final List<Object> objectList) { 
      INSTANCE.mObjectList = objectList; 
     } 

     public static List<Object> getData() { 
      final List<Object> retList = INSTANCE.mObjectList; 
      INSTANCE.mObjectList = null; 
      return retList; 
     } 
    } 

    @Override 
    protected void onCreate(final Bundle savedState) { 
     super.onCreate(savedState); 

     // Get the activity intent if there is a one 
     final Intent intent = getIntent(); 

     // And retrieve arguments if there are any 
     if (intent.hasExtra(ARG_STRING)) { 
      stringField = intent.getExtras().getString(ARG_STRING); 
     } 
     if (intent.hasExtra(ARG_INT)) { 
      intField = intent.getExtras().getInt(ARG_INT); 
     } 
     // And we retrieve large data from enum 
     if (DataHolder.hasData()) { 
      arrayField = DataHolder.getData(); 
     } 

     // Now stringField, intField fields are available 
     // within the class and can be accessed directly 
    } 

    /** 
    * /** A static method for starting activity with supplied arguments 
    * 
    * @param contextA 
    *   context that starts this activity 
    * @param stringArg 
    *   A string argument to pass to the new activity 
    * @param intArg 
    *   An int argument to pass to the new activity 
    * @param objectList 
    *   An object list argument to pass to the new activity 
    */ 
    public static void startActivity(final Context context, final String stringArg, 
      final int intArg, final List<Object> objectList) { 

     // Initialize a new intent 
     final Intent intent = new Intent(context, SomeActivity.class); 

     // To speed things up :) 
     intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 

     // And add arguments to the Intent 
     intent.putExtra(ARG_STRING, stringArg); 
     intent.putExtra(ARG_INT, intArg); 

     // Now we put the large data into our enum instead of using Intent extras 
     DataHolder.setData(objectList); 

     context.startActivity(intent); 
    } 
} 

अधिक जानकारी here

+0

यह मेरे लिए काम करता है! :) –

+0

अपने समाधान की सराहना करें :) – Nisarg

+0

क्या यह enum serialization का उपयोग करता है? सिंगलटन दृष्टिकोण की तुलना में यह प्रदर्शनवार कैसे है? –

संबंधित मुद्दे

 संबंधित मुद्दे