5

製品リストがありますが、メソッドが 65535 バイトの制限を超えていると Java が訴えます。単語を追加して制限を超えるにはどうすればよいですか?

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 の制限であることがわかります。この回答を参照してください。私の理解では、クラス ファイルのジャンプ オフセットは 16 ビットです。つまり、メソッドのサイズは最大で 65535 バイトです。

したがって、ハックの解決策は、これをより小さなメソッドに分割することです。

// 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 が提供するString Arrayを使用することに本当に反対している場合は、これらの文字列をアセットのテキスト ファイルに入れ、通常の Java を介して読み込むこともできますBufferedReader

于 2012-12-12T18:51:21.153 に答える
0

解決策は、事実上無限であるヒープにオブジェクトを動的に割り当てることです。

于 2012-12-12T18:40:01.680 に答える