android输入表单上的java.lang.ArrayIndexOutOfBoundsException

时间:2011-12-22 16:56:50

标签: java android

我有一个包含38个字段的输入表单 我知道这太多了,但我的老板希望它像那样

有4个编辑文本和微调器作为其余部分,1个imageView将使用http客户端上传到服务器

我使用AsyncTask发送如下数据:

new asyncTask().execute(array, array, array);

因为项目太多,我想我错过了其中一项 我已经多次检查过了,但我仍然得到了indexOutOfBounds异常

你能帮我找到它们或给我解决方案/建议来制作更简单的代码

这是代码(你的眼睛可能会受伤,因为它是整个代码):

http://pastebin.com/0dUss9ak

(这里写的太多了)

为什么我使用字母表作为变量的名称? 如果我为他们每个人使用名字,我将会死。

之前谢谢

3 个答案:

答案 0 :(得分:1)

在这一行

new KirimData().execute(id_user, nama, lokasi, keterangan, a, b, c, d, e, f, g, h, i, k, l, m, n, o, p, q, ad, bd, cd, dd, ed, fd, gd, hd, id, jd, kd, ld, md, nd, od, pd, qd, savedImagePath);

您似乎缺少参数j,这将(很可能)在

中导致异常

KirimData#doInBackground

答案 1 :(得分:1)

为了让您的代码和变量更易于管理,我强烈建议您使用使用字段名称的HashMaps(例如abc等。在你的代码中)作为键:

HashMap<String, String> fieldValues = new HashMap<String, String>();
HashMap<String, Spinner> fieldSpinners = new HashMap<String, Spinner>();

您可以通过迭代HashMap中的键并在每次迭代期间执行相同的逻辑(而不是复制/粘贴)来大幅减少代码复制(以及代码复制带来的错误)每个字段的代码行相同。)

另外,我建议使用更有意义的字段名称。它可能不会像现在这样产生紧凑的代码,但从长远来看它将更容易阅读和维护。

答案 2 :(得分:0)

实际上我在onCreate中找到了恶意代码:

    File nfile = new File(Environment.getExternalStorageDirectory()+"/Android/data/com.nigmagrid.jm.demo/");
     nfile.mkdir();

为什么每次应用程序启动时总是创建目录?

如果你真的很难把那么多的微调器, 我建议你应该添加你的微调器,以编程方式添加它。 - 首先,您可以给主要布局充气

    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    ViewGroup inflatedLayout = (ViewGroup) inflater.inflate(<your layout xml>, null);

然后将Spinner内容放在ArrayAdapter

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    adapter.add("Jembatan 1");
    adapter.add("Jembatan 2");
    adapter.add("Jembatan 3");

我不知道每个Spinner是否都有不同的内容。 如果他们这样做,您可以声明不同的适配器或从资源创建它。 然后添加所需的所有微调器:

    for(int i=0;i<35;i++){
        Spinner s = new Spinner(this);
        s.setAdapter(adapter);
        s.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                Spinner s = (Spinner) parent;
                String selectedItem = (String) s.getSelectedItem();
                Toast.makeText(InflateCoba.this, selectedItem, Toast.LENGTH_SHORT).show();
                // or you can assign it to a variable
                // selectedStr[i] = selectedItem;
            }
            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
            }
        });
        inflatedLayout.addView(s);
    }

设为主视图

    setContentView(inflatedLayout);

关于btn_proses点击监听器,我建议你不要创建新的asyncTask对象, 在初始化中声明它并使用您声明的实例。

    HashMap<String, Object> kirimPaket = new HashMap<String, Object>();
    kirimPaket.put("nama", nama);
    kirimPaket.put("keterangan", keterangan); // and do the rest ..
    kirimPaket.put("spinnerItem", selectedStr);
    kirim.execute(kirimPaket);

哪个kirim是KirimData的一个实例。 使用HashMap并将数据包放在那里,这将使它变得简单。

    protected class KirimData extends AsyncTask<HashMap<String, Object>, Void, String>

其实我不喜欢asyncTask发送参数的方式,谷歌应该这么简单。 然后最终确定它

    @Override
        protected String doInBackground(HashMap<String, Object>... params) {
            try{
                HttpClient httpClient = CustomHttpClient.getHttpClient();
                HttpPost postRequest = new HttpPost(VarsUrl.getServerAddress()+"simpan-inspeksi-jembatan.php");

                MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
                String nama = params[0].get("nama");
                String keterangan = params[0].get("keterangan"); // and do the rest  ..
                String[] selectedStr = params[0].get("spinnerItem");

                reqEntity.addPart("nama", new StringBody(nama));
                reqEntity.addPart("keterangan", new StringBody(keterangan)); // and do the rest  ..
                for(int i=0;i<selectedStr.length;i++){
                    reqEntity.addPart("item_"+i, new StringBody(selectedStr[i]));
                }
           ....