Android 提高了使用 JSON 数据填充表布局时的性能

标签 android json performance android-tablelayout

有一个 WebService 在请求时返回 500 行 2darray 的 JSON 字符串。 数组大小约为 45KB。 填充数据所需的平均时间为 20 秒。

这是如何完成的:

public View PopulateData(String json_data)
{
    ja = new JSONToStringArray(json_data);
    number_of_columns = ja.getColumns();
    al = ja.getArrayList();

    int column_num = 0;
    int row_num = -1;
    Activity activity = (Activity)main;

    table.setId(CTlist.indexOf(CT));

    initialState = new String[(al.size()/number_of_columns)][number_of_columns];

    for (String item : al)
    {   
        if (column_num % number_of_columns == 0)
        {
            row = new TableRow(main);
            row.setGravity(Gravity.CLIP_HORIZONTAL);
            row.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
            row.setClipChildren(true);
            row.setId(10000 + row_num);
            table.addView(row);             
            column_num = 0;
            row_num++;
        }       




        et = new EditText(main);
        et.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));
        et.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_MULTI_LINE);
        int px = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 150, activity.getResources().getDisplayMetrics());
        et.setMaxWidth(px);
        et.setText(item);
        et.setId(column_num);
        et.setBackgroundResource(R.drawable.rounded_rect);


        initialState[row_num][column_num] = item;


        et.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                // TODO Auto-generated method stub
                if (!(v instanceof EditText))
                {                       
                    return;
                }
                EditText tableEt = (EditText)v;

                if(hasFocus)
                {
                    tableEt.setTag(tableEt.getText().toString());
                    tableEt.setText("");
                }
                else
                {
                    if(tableEt.getText().toString().equals(""))
                    {
                    tableEt.setText(tableEt.getTag().toString());
                    tableEt.setTag(null);
                    }

                }
            }
        });

        et.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView arg0, int arg1,
                    KeyEvent arg2) {
                // TODO Auto-generated method stub
                if (arg2.getKeyCode() == KeyEvent.KEYCODE_ENTER)
                {
                    if(arg2.isAltPressed())
                        {
                            return true;
                        }
                    View v = arg0.focusSearch(View.FOCUS_DOWN);
                    if(!(v instanceof EditText))
                    {
                        KeyEvent.changeAction(arg2, KeyEvent.FLAG_CANCELED);
                        return true;
                    }
                    EditText etBelow = (EditText)v;
                    if (etBelow != null)
                    {
                        if (arg0.getText().toString().equals(""))
                        {

                            arg0.setText(arg0.getTag().toString());
                            arg0.setTag("");
                        }
                        etBelow.requestFocus();     
                    }
                    KeyEvent.changeAction(arg2, KeyEvent.FLAG_CANCELED);
                }
                return true;
            }


        }); 

        row.addView(et);
        column_num++;

    }


    view = table;
    return view;
}

任何事情都可以接受,甚至完全改变我做事的方式,只要它能快速填满我的 table 。

延迟主要是et.SetText(item)造成的;接下来是 row.AddView(et);

最佳答案

我会考虑使用:

关于Android 提高了使用 JSON 数据填充表布局时的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21623207/

相关文章:

ruby-on-rails - Ruby on Rails - Bullet/N+1

performance - 如何在没有乘法/分支的情况下使用一些常量和运算符翻转整数值的符号

java - TimePickerDialog 和时区

java - HTTPClient "main"java.lang.NoSuchFieldError : INSTANCE at org. apache.http.conn.ssl.SSLConnectionSocketFactory.<clinit>

c# - Google Maps API - 从 JSON 响应中读取地点详细信息

ruby - 如何在 Ruby on Rails 3 中从 JSON 响应创建 map ?

php - Doctrine 实体删除 vs 删除查询,性能比较

java - 从 MP3/MIDI 文件中提取音频数据

Android NFC writeNdefMessage 抛出 IOException Tag is not ndef

android - 从应用程序包生成 APK 时签署信息