5

我有一个产品列表,但 Java 抱怨该方法超出了 65535 字节的限制。如何添加更多单词并克服限制?

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


}

}

为了更容易理解:

在此处输入图像描述

提前致谢

4

3 回答 3

8

据我所知,这不是 Sqlite 的限制 - Eclipse 错误表明它是方法的问题。

强烈建议,如果您有大量数据,则应将其保存在单独的资源中。然后只需在执行时加载资源。无需将其融入您的代码中。如果需要,您始终可以包含一些字符串以替换为平台行分隔符。

于 2012-12-12T18:39:52.673 回答
2

您在堆栈上分配该数组,并且堆栈通常有 64kb 的限制,它可以容纳多少。

您的解决方案是使用堆。如果您将代码更改为

// 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

然后我打赌那会奏效。

但是,您最好的选择是按照 Jon Skeet 的说法,将所有数据存储在资源中,并在需要时加载。由于看起来您使用的是 Android,因此我建议您使用String Arrays,这就是您应该如何处理此类数据的方式。

更新:

有趣的。所以事实证明这是一个Java限制。看到这个答案。我的理解是class文件中的跳转偏移量是16位的,也就是说方法的大小最多可以是65535字节。

因此,hack 解决方案是将其拆分为更小的方法:

// 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
}

但这是一个可怕的想法。将这些字符串放在某种数据文件中然后在运行时加载它确实会更好。如果出于某种原因您真的反对做正确的事情并使用 Google 为您提供的字符串数组,那么您也可以将这些字符串放在 assets 中的文本文件中,然后通过普通的 Java 读取它BufferedReader

于 2012-12-12T18:51:21.153 回答
0

解决方案是将对象动态分配到堆中,这实际上是无限的。

于 2012-12-12T18:40:01.680 回答