Я новичок в Stackoverflow.

Я пытаюсь сделать конвертер единиц, в котором функция "CalculateCurrency" возвращает двойное значение результата. Но значение TextView "outputNumber" всегда меняется в зависимости от предыдущего ввода.

Например, если я наберу 1, то outputNumber изменится на «ноль», но когда я введу другую цифру после 1, тогда outputNumber изменится на значение, которое должно было быть изменено на 1. Но Toast отображает правильное значение, т.е. на 1 отображается 1, поэтому значение myInputNumber является правильным в соответствии с вводом.

Кто-нибудь может мне помочь?

inputNumber.addTextChangedListener(
            new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }

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

                @Override
                public void afterTextChanged(Editable s) {
                    try {
                        myInputNumber = Double.parseDouble(s.toString());
                        Double myText = calculations.calculateCurrency(myInputNumber, convertFrom, convertTo);
                        Toast.makeText(MainActivity.this, myInputNumber+"", Toast.LENGTH_SHORT).show();
                        outputNumber.setText(myText+"");
                    } catch (ExecutionException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
    );

Код расчетов. CalculateCurrency:

 public Double calculateCurrency(Double input, String convertFrom, String convertTo) throws ExecutionException, InterruptedException {
        myCurrencyFetcher fetchCurrency = new myCurrencyFetcher();
        fetchCurrency.execute(Double.toString(input), convertFrom, convertTo);
        return myText;
}


class myCurrencyFetcher extends AsyncTask<String, Double, Double>{

    URL url;
    StringBuffer stringBuffer;

    @Override
    protected Double doInBackground(String... params) {
        try{
            Double myInputNumber = Double.parseDouble(params[0]);
            String convertFrom = params[1];
            String convertTo = params[2];
            url = new URL("http://api.fixer.io/latest?base="+convertFrom+"&symbols="+convertTo);

            HttpURLConnection connection;
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();

                InputStream inputStream = connection.getInputStream();

                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

                stringBuffer = new StringBuffer();

                String line = "";
                while((line = reader.readLine()) != null){
                    stringBuffer.append(line);
                }
            String finalJSON = stringBuffer.toString();

            JSONObject parentObject = new JSONObject(finalJSON);
            JSONObject finalObject = parentObject.getJSONObject("rates");

            String rate = finalObject.getString(convertTo);
            //String year = finalObject.getString("year");
            Double myRate = Double.parseDouble(rate);

            return myInputNumber*myRate;
            } catch (Exception e) {
                e.printStackTrace();
            }
        return null;
    }

    @Override
    protected void onPostExecute(Double result) {
        super.onPostExecute(result);
        Calculations.myText = result;
    }
}
0
Akarsh 28 Май 2017 в 18:59

2 ответа

Лучший ответ

Вы должны изменить свой код.

@Override
    public void afterTextChanged(Editable s) {
        try {
            myInputNumber = Double.parseDouble(s.toString());
            Double myText = calculations.calculateCurrency(myInputNumber, convertFrom, convertTo);
            Toast.makeText(MainActivity.this, myInputNumber+"", Toast.LENGTH_SHORT).show();
            //outputNumber.setText(myText+""); // Remove this line
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
    }

Добавьте TextView (outputNumber) в конструктор в качестве аргумента. myCurrencyFetcher fetchCurrency = new myCurrencyFetcher (outputNumber);

class myCurrencyFetcher extends AsyncTask<String, Double, Double>{

 private WeakReference<TextView> weakOutputNumber; 

 public myCurrencyFetcher (TextView outputNumber) {
     weakOutputNumber= new WeakReference<TextView>(outputNumber);
 } 

 /* ... Other methods are the same */

 @Override
    protected void onPostExecute(Double result) {
        super.onPostExecute(result);
        //Calculations.myText = result;
        if (weakOutputNumber != null) {
        TextView outputNumber = weakOutputNumber.get();
           if (outputNumber != null) {
               outputNumber.setText(new String(result));
           }
        }

    }

}
0
Sunhee 28 Май 2017 в 16:33

Попробуйте еще раз добавить synchronized в метод calculations.calculateCurrency(myInputNumber, convertFrom, convertTo);

0
Dungnbhut 28 Май 2017 в 16:20