如何解决说明onClick超过65535字节限制的android错误

时间:2014-02-23 02:44:17

标签: android

public void onClick(View v) {
   //this contains 4,095 if conditions
}

代码是不可执行的,因为它说:

Multiple markers at this line
 -implements android.view.View.OnClickListener.onClick
 -The code of method onClick(View) is exceeding the 65535 bytes limit

任何人都可以帮我解决这个问题吗?因为我的代码中实际上需要那些4,095。

1 个答案:

答案 0 :(得分:2)

如果你想保留4095 if语句,那么我会做这样的事情:

   @Override
    public void onClick(View v) {
        if (! processPart1(v)) {
            processPart2(v);
        }
    }

    private boolean processPart1(View v) {
        if (q1.isChecked() && !q2.isChecked() && !q3.isChecked() && !q4.isChecked() && !q5.isChecked() && !q6.isChecked() && !q7.isChecked() && !q8.isChecked() && !q9.isChecked() && !q10.isChecked() && !q11.isChecked() && !q12.isChecked()) { 
            // do your thing
            return true;
        }
        else if (!q1.isChecked() && q2.isChecked() && !q3.isChecked() && !q4.isChecked() && !q5.isChecked() && !q6.isChecked() && !q7.isChecked() && !q8.isChecked() && !q9.isChecked() && !q10.isChecked() && !q11.isChecked() && !q12.isChecked()) { 
            // do your thing
            return true;
        }
        // more conditions here...
        return false;
    }

    private void processPart2(View v) {
        // more conditions
    }

但是,你可以更快地实现这一点,也更容易模块化:

    boolean q[] = {q1.isChecked(), q2.isChecked(), q3.isChecked(),
                   q4.isChecked(), q5.isChecked(), q6.isChecked(),
                   q7.isChecked(), q8.isChecked(), q9.isChecked(),
                  q10.isChecked(), q11.isChecked(), q12.isChecked()};
    int value = 0;
    for (int i = 0, len = q.length; i < len; i++) {
        value += (q[i] ? 1 : 0) << i; 
    }

    switch(value) {
    case 0: // do your thing
    case 1: // do your thing
    case 2: // do your thing
    // more case statements ...
    }

虽然你的代码必须通过2048 if if语句平均上面的代码只处理12个值,然后直接跳转到正确的case语句。它也更不容易出错,可以很容易地分成不同的方法:

processValues0To1023(value);
processValues1024To2047(value);
processValues2048To3071(value);
processValues3072To4095(value);

private void processValues0To1023(int value) {
    switch(value) {
    case 0: // do your thing
    // more case statements ...
    }
}

private void processValues1024To2047(int value) {
    switch(value) {
    case 1024: // do your thing
    // more case statements ...
    }
}

private void processValues2048To3071(int value) {
    // ditto
}

private void processValues3072To4095(int value) {
    // ditto
}