Application get freeze whete set double value to e

2019-08-16 03:57发布

问题:

I am developeing app where i want to change the currency value from one to another, Like i have 2 edittext. one for USD Currency to enter and other for EURO currency to enter. Now i want to enter value in 1 edittext and the calculated value should display in other and same for the other edit text box.

 TextWatcher inputTextWatcher = new TextWatcher()
    {
        public void afterTextChanged(Editable s) 
        { 

            try { 
                Start_Calculate(""+s.toString());
                } 
                 catch (NumberFormatException nfe) 
                { //or whatever exception you get
                }
                      //do some handling if you need to



        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after)
        {

        }
        public void onTextChanged(CharSequence s, int start, int before, int count) 
        {

        }
    };

    amountET.addTextChangedListener(inputTextWatcher);


    TextWatcher inputTextWatcher1 = new TextWatcher() {
        public void afterTextChanged(Editable s) 
        { 


            try { 
                Start_Calculate2(""+s.toString());
                } 
                 catch (NumberFormatException nfe) 
                { //or whatever exception you get
                }

        }
        public void beforeTextChanged(CharSequence s, int start, int count, int after){
        }
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }
    };

    amount2ET.addTextChangedListener(inputTextWatcher1);

FUNCTION ARE HERE:

   public void Start_Calculate(String val)
{

        String user_input_value="00.00";

    try
    {
    // user_input_value=""+amountET.getText().toString();
         user_input_value=""+val;
    }
    catch(NumberFormatException e)
    {
        user_input_value="00.00";
    }
    //*/

    if(!user_input_value.equalsIgnoreCase(""))
    {

    if(user_input_value.length()<11)
    {
        try
        {
            user_amount=Double.parseDouble(""+user_input_value);
        }
        catch(NumberFormatException e)
        {
            user_amount=00.000;
        }



        if(user_amount>0)
        {

            user_amount=user_amount*1.0000001;
            total_amount_to_send=((user_amount*to_amount_val)/from_amount_val);
        //  total_amount_to_send=   total_amount_to_send+00.0000;
            //String total=new DecimalFormat("##.##").format(total_amount_to_send);
         //  totalTV.setText(user_amount+" "+fromTV.getText().toString()+" = "+ total+" ("+toTV.getText().toString()+")");
            // totalTV.setText(user_amount+" = "+ total);


            //  String finalVal= df.format(target_currency_val);

            //total_calTV.setText("( "+user_amount+" × "+df.format(to_amount_val) +" = "+ total+" )");

             String total="00.00";
             DecimalFormat df = new DecimalFormat("#.####");
             total=""+df.format(total_amount_to_send);

             try
             {
            amount2ET.setText(""+total);//_amount_to_send+"");
             }
             catch(Exception e) 
             { 
                Log.e("Error in Calculate1: ",""+e.getMessage());
                }

            //showtoast(""+total);//_amount_to_send);

            //usdTV.setText(""+user_amount+" ("+fromTV.getText().toString()+")");
            //pkrTV.setText(""+ total+" ("+toTV.getText().toString()+")");


        }
        else
        {


        }
    }
    else
    {

    }

    }
}


public void Start_Calculate2(String val)
{

        //String user_input_value="0";
    //String user_input_value=""+val;
    String user_input_value="0";

    try
    {
     //user_input_value=""+amount2ET.getText().toString();
        user_input_value=val;
    }
    catch(NumberFormatException e)
    {
        user_input_value="00.00";
    }
    //*/
    if(!user_input_value.equalsIgnoreCase(""))
    {

    if(user_input_value.length()<11)
    {
        try
        {
            user_amount=Double.parseDouble(""+user_input_value);
        }
        catch(NumberFormatException e)
        {
            user_amount=00.00;
        }

        if(user_amount>0)
        {

            user_amount=user_amount*1.0000001;

            total_amount_to_send=((user_amount*from_amount_val)/to_amount_val);
        //  total_amount_to_send=   total_amount_to_send+00.0000;
            //String total=new DecimalFormat("##.##").format(total_amount_to_send);
           // totalTV.setText(user_amount+" "+toTV.getText().toString()+" = "+ total+" ("+fromTV.getText().toString()+")");

            // totalTV.setText(user_amount+" = "+ total);

              //DecimalFormat df = new DecimalFormat("#.##");
            //  String finalVal= df.format(target_currency_val);

            //total_calTV.setText("( "+user_amount+" × "+df.format(to_amount_val) +" = "+ total+" )");





            String total=new DecimalFormat("##.##").format(total_amount_to_send);

             try
             {
             amountET.setText(""+total);//_amount_to_send);
             }
             catch(Exception e) 
             { 
                Log.e("Error in Calculate-2: ",""+e.getMessage());
                }

            //showtoast(""+total);//_amount_to_send);
            //usdTV.setText(""+user_amount+" ("+fromTV.getText().toString()+")");
            //pkrTV.setText(""+ total+" ("+toTV.getText().toString()+")");


        }
        else
        {
            //totalTV.setText("");
            //total_calTV.setText("");
        }
    }
    else
    {
        //totalTV.setText("");
        //total_calTV.setText("");
    }

    }
}

回答1:

It is because you get infinite loop.

amount2ET.setText will toggle another "afterTextChanged" let you repeat and repeat call of Start_Calculate.

You should remove the listener before set the text

 amountET.removeTextChangedListener(inputTextWatcher)

             try
             {
             amountET.setText(""+total);//_amount_to_send);
             }
             catch(Exception e) 
             { 
                Log.e("Error in Calculate-2: ",""+e.getMessage());
                }

 amountET.addTextChangedListener(inputTextWatcher);

Or you can set a global flag true when updating so you can dismiss another Start_Calculate:

boolean updating = false;

public void afterTextChanged(Editable s) 
        { 

            try { 
               if (!updating)
                Start_Calculate(""+s.toString());
                } 
                 catch (NumberFormatException nfe) 
                { //or whatever exception you get
                }
                      //do some handling if you need to



        }

Inside Start_Calculate:

updating = true;

         try
         {
         amountET.setText(""+total);//_amount_to_send);
         }
         catch(Exception e) 
         { 
            Log.e("Error in Calculate-2: ",""+e.getMessage());
            }


updating = false;