#java #android
На этот вопрос уже даны ответы здесь: Не могу возвратить результат из анонимного класса (3 ответа) Закрыт 4 года назад. Надо получить обработанную переменную 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, но в логе он выводит лишь "" и все. :( }
Ответы
Ответ 1
В методе 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); }
Комментариев нет:
Отправить комментарий