2012-12-12 7 views
5

Ho un elenco di prodotti ma Java si lamenta che il metodo supera il limite di 65535 byte. Come posso aggiungere più parole e superare il limite?Come superare il limite di 65535 byte per il codice del metodo

public class ProductList extends Activity { 

    // List view 
private ListView lv; 

// Listview Adapter 
ArrayAdapter<String> adapter; 

// Search EditText 
EditText inputSearch; 

// ArrayList for Listview 
ArrayList<HashMap<String, String>> productList; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_product_list); 


    String as = System.getProperty("line.separator"); 

    String products[] = { 


      // I want these words to keep in a database 
      // Because here is 65kb limit but I need more... 



      "Banana" +as+ "Its color is yellow." , 
      "Orange" +as+ "Orange is a sour fruit." , 
      "Onion" +as+ "Onion usually used on Pizza" , 
      "Google" +as+ "Google is a giant search engine." , 
      "Love" +as+ "Love is related to heart." , 
      "Lily" +as+ "It is one kind of white flower." , 
      "Banana" +as+ "Its color is yellow." , 
      "Orange" +as+ "Orange is a sour fruit." , 
      "Onion" +as+ "Onion usually used on Pizza" , 
      "Google" +as+ "Google is a giant search engine." , 
      "Love" +as+ "Love is related to heart." , 
      "Lily" +as+ "It is one kind of white flower." ,   
      "Banana" +as+ "Its color is yellow." , 
      "Orange" +as+ "Orange is a sour fruit." , 
      "Onion" +as+ "Onion usually used on Pizza" , 
      "Google" +as+ "Google is a giant search engine." , 







    }; 



    lv = (ListView) findViewById(R.id.list_view); 
    inputSearch = (EditText) findViewById(R.id.inputSearch); 

    // Adding items to listview 
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.p_list, products); 
    lv.setAdapter(adapter); 

    /** 
    * Enabling Search Filter 
    * */ 
    inputSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      ProductList.this.adapter.getFilter().filter(cs); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
     } 
    }); 


} 

} 

Per una più facile comprensione:

enter image description here

Grazie in anticipo

+0

Legge i dati da un file. – dmon

risposta

8

Questa non è una limitazione a che fare con Sqlite per quanto posso dire - l'errore Eclipse sta dimostrando che è un problema con il metodo .

Vorrei fortemente suggerire che se si dispone di molti dati, è necessario mantenerlo in una risorsa separata. Quindi caricare la risorsa al momento dell'esecuzione. Non è necessario inserirlo nel codice . È sempre possibile includere alcune stringhe da sostituire con il separatore di linea della piattaforma, se necessario.

+1

"Strongly" dovrebbe anche essere evidenziato in grassetto e sottolineato. Questo è solo l'approccio sbagliato :) – dmon

0

La soluzione è allocare gli oggetti dinamicamente nell'heap, che è praticamente infinito.

2

Si sta allocando quella matrice nello stack e lo stack di solito ha un limite di 64kb in quanto può contenere.

La soluzione è utilizzare l'heap. Se hai cambiato il tuo codice per essere

// allocate an array on the heap 
ArrayList<String> products = new ArrayList<String>(); 
products.add("Banana" +as+ "Its color is yellow."); 
products.add("Orange" +as+ "Orange is a sour fruit."); 
products.add("Onion" +as+ "Onion usually used on Pizza"); 
// etc 

Poi ho scommesso che avrebbe funzionato.

La tua migliore opzione, tuttavia, è fare ciò che Jon Skeet ha detto e memorizzare tutti i dati in una risorsa e caricarlo quando ne hai bisogno. Dal momento che sembra che tu stia usando Android, ti suggerirei di usare String Arrays, che è il modo in cui dovresti gestire questo tipo di dati.

UPDATE:

Interessante. Quindi si scopre che questa è una limitazione di Java. Vedi this answer. La mia comprensione è che le correzioni di salto nei file di classe sono a 16 bit, il che significa che i metodi possono essere al massimo 65535 byte di dimensione.

Quindi la soluzione hack è di dividere questo in metodi più piccoli:

// allocate an array on the heap 
ArrayList<String> products = new ArrayList<String>(); 
addFirstThousand(products); 
addSecondThousand(products); 
// etc. 

private void addFirstThousand(ArrayList<String> products) { 
    products.add("Banana" +as+ "Its color is yellow."); 
    products.add("Orange" +as+ "Orange is a sour fruit."); 
    products.add("Onion" +as+ "Onion usually used on Pizza"); 
    // etc 
} 

Ma questo è un terribile idea . Sarebbe davvero meglio mettere queste stringhe in una sorta di file di dati e poi caricarlo in fase di runtime. Se per qualche motivo sei davvero contrario a fare la cosa giusta e ad usare lo String Array che Google ti ha fornito, potresti anche semplicemente mettere quelle stringhe in un file di testo in risorse e leggerlo attraverso il normale Java BufferedReader.

+0

Siccome sono nuovo ad Android, mi piace lo stile. Ma sfortunatamente ha lo stesso problema. Dai un'occhiata a https://dl.dropbox.com/u/15065300/problem-2.png – Jani

+0

@ user1898736 Sembra che sia un limite JVM. Guarda l'aggiornamento. –

+0

Boss, Potresti essere molto impegnato, ma quindi ti chiedo di aggiungere un piccolo file di testo nella mia app qui http: // www.mediafire.com/?83bol5mhgromgg0 Grazie mille in anticipo – Jani

Problemi correlati