3

Надо получить обработанную переменную soapXml. Как это сделать?

public class MainActivity extends Activity
{
    public String soapXml = "";
    final String LOG_TAG = "myLogg";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et3 = (EditText) findViewById(R.id.editText3);

        et3.setOnEditorActionListener(new TextView.OnEditorActionListener()
        {
            val3 = et3.getText().toString();
            receiver = new BroadcastReceiver()
            {
                @Override
                public void onReceive (Context context, Intent intent)
                {

                    soapXml = intent.getStringExtra("xml");
                    tv.setText(soapXml); // здесь он выводит обработанную переменную
                }
            }
        });
    }
    Log.d(LOG_TAG,soapXml) // здесь надо получить обработанную переменную soapXml, но в логе он выводит лишь "" и все. :(
}
Samur
  • 61
  • 1
    Ваша проблема в том, что вы не понимаете как все это работает. То, что вы передали анонимный класс в метод, не означает что код в нем выполнится сразу же. Он выполнится тогда, когда его вызовет тот, кому вы его передали. А в какой момент это случится никому не известно, при определенных обстоятельствах этого вообще может не произойти. Следовательно вы никогда не получите обновленную переменную в том месте, где вы выводите ее в лог. Ищите другие пути решение. – temq Feb 15 '16 at 07:37
  • Код некомпилируем, поправьте. – sercxjo Feb 15 '16 at 08:10

1 Answers1

3

В методе setOnEditorActionListener в качестве аргумента вы передаете экземпляр анонимного класса. В этом случае происходит захват переменных по значению. В вашем случае копируется по значению указатель на переменную soapXml, который затем изменяется. Но это изменение будет видно только внутри тела анонимного класса. Более подробно, почему так происходит.

Как вариант, вы можете создать вложенный класс и его экземпляр передавать в качестве аргумента, откуда затем получать новое значение soapXml.

Второй вариант: создать вложенный класс, в котором обернуть объект типа String и экземпляр этого класса передавать в анонимный класс, тогда вы сможете извлечь новое значение строки извне замыкания. Пример:

public class MainActivity extends Activity {
    private class SoapResponse {
       public String soapXml;
    }

    private SoapResponse soapResponse = new SoapResponse();
    final String LOG_TAG = "myLogg";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        et3.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            val3 = et3.getText().toString();
            receiver = new BroadcastReceiver() {
                @Override
                public void onReceive (Context context, Intent intent) {
                    soapResponse.soapXml = intent.getStringExtra("xml");
                    tv.setText(soapResponse.soapXml);
                }
            }
        });
    }

    Log.d(LOG_TAG, soapResponse.soapXml);
}
  • можете поделиться примером кода как это сделать? – Samur Feb 14 '16 at 18:02
  • @Samur, добавил пример, код не тестировал, но думаю все будет нормально. – Pavel Parshin Feb 14 '16 at 18:33
  • не работает :( . В лог ничего не выводится – Samur Feb 14 '16 at 19:38
  • А логирование вы где вызываете? – Pavel Parshin Feb 14 '16 at 20:03
  • в том месте где вы указали – Samur Feb 14 '16 at 20:32
  • Не совсем понял тогда. Вызов метода возможен либо в блоке инициализации, либо в другом методе. Я думал, вы просто указали, что потом вызываете этот метод. А так код не должен скомпилироваться – Pavel Parshin Feb 14 '16 at 20:41
  • вызвал щас в методе onCreate, там тоже ничего не выводится в логе – Samur Feb 14 '16 at 20:45
  • Вы устанавливаете callback функцию на элемент, которая будет вызвана при наступлении события. Только после этого soapXml будет обновлена. До этого момента в логах не будет ничего – Pavel Parshin Feb 14 '16 at 21:10
  • как тогда дождаться обновления SoapXml и вывести уже обновленный soapXml в лог? – Samur Feb 14 '16 at 21:26
  • Например, в методе onReceive, там вы обновляете переменную и там же можете выводить в лог. – Pavel Parshin Feb 14 '16 at 21:35
  • ну в методе onReceive я изначально не хотел выводить, мне надо было в другом методе получить доступ к обноовленному soapXml – Samur Feb 14 '16 at 21:38