2013-08-14 2 views
-1

내 처리기에서 스위치/사례 구문이 작동하지 않는 Android 응용 프로그램에서 문제가 발생했습니다. switch/case 문을 수행 한 주된 이유는 내가 가지고있는 핸들러의 양을 제한하는 것입니다.처리기에서 switch/case 문을 수행 할 수 없습니다.

if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") 
       && edittextdollars.length() > 0 
       && edittexteuros.length() == 0) { 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         handler.sendEmptyMessage(2); 
         convertvalues("USD", "EUR"); 
         img1.setImageDrawable(grabImageFromUrl(imageUrl1)); 
        } catch (Exception e) { 
         edittexteuros.setText("Error"); 
        } 

       } 
      }); 
      thread.start(); 

     } 

     if (text1.equals("US Dollar - USD") && text2.equals("Euro - EUR") 
       && edittexteuros.length() > 0 
       && edittextdollars.length() == 0) { 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         handler.sendEmptyMessage(3); 
         convertvalues2("EUR", "USD"); 
         img1.setImageDrawable(grabImageFromUrl(imageUrl2)); 
        } catch (Exception e) { 

        } 

       } 
      }); 
      thread.start(); 

     } 
     if (text1.equals("Euro - EUR") && text2.equals("US Dollar - USD") 
       && edittextdollars.length() > 0 
       && edittexteuros.length() == 0) { 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         handler.sendEmptyMessage(4); 
         convertvalues("EUR", "USD"); 
         img1.setImageDrawable(grabImageFromUrl(imageUrl2)); 
        } catch (Exception e) { 

        } 

       } 
      }); 
      thread.start(); 
     } 
     if (text1.equals("Euro - EUR") && text2.equals("US Dollar - USD") 
       && edittexteuros.length() > 0 
       && edittextdollars.length() == 0) { 
      convertvalues2("USD", "EUR"); 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         handler.sendEmptyMessage(5); 
         convertvalues2("USD", "EUR"); 
         img1.setImageDrawable(grabImageFromUrl(imageUrl2)); 
        } catch (Exception e) { 

        } 

       } 
      }); 
      thread.start(); 
     } 
     if (text1.equals("Euro - EUR") && text2.equals("Euro - EUR") 
       && edittextdollars.length() > 0 
       && edittexteuros.length() == 0) { 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         handler.sendEmptyMessage(6); 
         convertEurostoEuros(); 
         //img1.setImageDrawable(grabImageFromUrl(imageUrl1)); 
        } catch (Exception e) { 

        } 

       } 
      }); 
      thread.start(); 
     } 
     if (text1.equals("Euro - EUR") && text2.equals("Euro - EUR") 
       && edittexteuros.length() > 0 
       && edittextdollars.length() == 0) { 
      Thread thread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         handler.sendEmptyMessage(7); 
         OppositeOfConvertEurostoEuros(); 
        } catch (Exception e) { 

        } 

       } 
public Handler handler = new Handler() { 
     public void handleMessage(android.os.Message msg) { 
      dialog1.dismiss(); 
      try { 
      switch (msg.what) { 
      case 2: 
       img1.setImageDrawable(grabImageFromUrl(imageUrl1)); 
       convertvalues("USD", "EUR"); 
      break; 
      case 3: 
       convertvalues2("EUR", "USD"); 
       img1.setImageDrawable(grabImageFromUrl(imageUrl2)); 
      break; 
      case 4: 
       convertvalues("EUR", "USD"); 
       img1.setImageDrawable(grabImageFromUrl(imageUrl2)); 
      break; 
      case 5: 
       convertvalues2("USD", "EUR"); 
       img1.setImageDrawable(grabImageFromUrl(imageUrl2)); 
      break; 
      case 6: 
       convertEurostoEuros(); 
      break; 
      case 7: 
       OppositeOfConvertEurostoEuros(); 
      break; 
      case 8: 
       convertDollarstoDollars(); 
      break; 
         } catch (Exception e) { 
       e.printStackTrace(); 
      } 
         } 
        }; 

public String convertvalues(String convertfrom, String convertto) { 
     double current; 
     double val = Double.parseDouble(edittextdollars.getText() 
       .toString()); 
     DecimalFormat df = new DecimalFormat(".##"); 
     YahooCurrencyConverter ycc = new YahooCurrencyConverter(); 
     try { 
      current = ycc.convert(convertfrom, convertto); 
      edittexteuros.setText(df.format(val * current)); 
      return "passed"; 
     } catch (Exception e) { 

      return "passed"; 
     } 
    } 

    public String convertvalues2(String convertfrom2, String convertto2) { 
     double current; 
     double val = Double.parseDouble(edittexteuros.getText().toString()); 
     DecimalFormat df = new DecimalFormat(".##"); 
     YahooCurrencyConverter ycc = new YahooCurrencyConverter(); 
     try { 
      current = ycc.convert(convertfrom2, convertto2); 
      edittextdollars.setText(df.format(val * current)); 
      return "passed"; 
     } catch (Exception e) { 

      return "passed"; 
     } 

    } 

    protected void convertEurostoEuros() { 
     double val = Double.parseDouble(edittextdollars.getText() 
       .toString()); 
     DecimalFormat df = new DecimalFormat(".##"); 
     edittexteuros.setText(df.format(val*1)); 
    } 

    protected void convertDollarstoDollars() { 
     double val = Double.parseDouble(edittextdollars.getText() 
       .toString()); 
     DecimalFormat df = new DecimalFormat(".##"); 
     edittexteuros.setText(df.format(val*1)); 
    } 

    protected void OppositeOfConvertEurostoEuros() { 
     double val = Double.parseDouble(edittexteuros.getText().toString()); 
     DecimalFormat df = new DecimalFormat(".##"); 
     edittextdollars.setText(df.format(val * 1)); 
    } 

    protected void OppositeOfConvertDollarstoDollars() { 
     double val = Double.parseDouble(edittexteuros.getText().toString()); 
     DecimalFormat df = new DecimalFormat(".##"); 
     edittextdollars.setText(df.format(val * 1)); 
    } 

내 응용 프로그램이 수행하는 것은 내가 JPY으로 INR의 환율을 찾으려는 경우에도이 EUR에 USD의 환율을 찾을 것입니다 : 여기에 내 코드의 내 역할이다. 왜 이렇게합니까? 그것은 제가 처리기에 넣은 첫 번째 사건이기 때문에입니까? 이 문제와 관련된 도움을 주시면 감사하겠습니다.

+0

handleMessage에는 try 블록이 있지만 아무것도 잡을 수 없습니다. 이것이 왜 그리고 이것이 어떻게 컴파일 되는가? – Mastergeek

+0

나는 그렇지만 나는 그것을 보여주지 않았다. – user2507301

+0

@Mastergeek 귀하의 의견에 따라 제 코드를 업데이트했습니다. – user2507301

답변

0

코드가 매우 혼란스럽고 여러 가지 문제가 있습니다. 당신은 크게이 디자인을 정리하고 다음을 수행하여 이러한 문제를 많이 제거 할 수 있습니다 :

  1. 직접 YahooCurrencyConverter 코드에 text1 또는 text2의 값을 변환합니다. 이제 코드와 코드가 있습니다. 정확히 어떻게하는지는 text1text2이 무엇인지에 따라 달라집니다. UI 텍스트의지도를 변환 코드에 저장하거나 평범한 이전 if 문을 사용하거나 enum을 사용하여이 모든 것을 백업 할 수 있습니다.
  2. 시작 및 종료 통화가 동일한 경우 변환이 필요하지 않습니다.
  3. 시작 및 끝 통화가 다른 경우 변환 코드를 YahooCurrencyConverter으로 전달하고 처리하도록합니다.

의사 코드 예 : getCurrencyCodeFromUI()가 UI 개체의 값에 따라 적절한 통화 코드를 가져옵니다

String code1 = getCurrencyCodeFromUI(text1); 
String code2 = getCurrencyCodeFromUI(text2); 

double ratio; 
if (code1.equals(code2)) { 
    ratio = 1.0; 
} else { 
    YahooCurrencyConverter ycc = ...; 
    ratio = ycc.convert(code1, code2); 
} 

// now ratio stores the conversion ratio, no matter what combination of 
// currencies was indicated by text1 and text2. 

.

기본적으로 text1과 text2의 가능한 모든 조합에 대해 처리기를 추가하는 것처럼 보입니다. 대신 텍스트 1과 텍스트 2를 별도로 변환 코드로 변환하면 나머지는 YahooCurrencyConverter으로 처리 할 수 ​​있습니다.

관련 문제