Насколько я знаю, мы не можем изменять элементы пользовательского интерфейса из doInBackground метода AsyncTask, но он не дает никаких исключений при выполнении этого же и изменении текста TextView.Умение обновлять интерфейс в doInBackground
public class MainActivity extends Activity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
Toast.makeText(MainActivity.this, "Main : " + Thread.currentThread().getName(), Toast.LENGTH_SHORT).show();
new DemoAsync().execute();
}
class DemoAsync extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
String threadName = "Async : " + Thread.currentThread().getName();
for(int i=0;i<1000;i++) {
tv.setText("Changed " + i);
}
return threadName;
}
@Override
protected void onPostExecute(String threadName) {
Toast.makeText(MainActivity.this, threadName, Toast.LENGTH_SHORT).show();
}
}
}
Я попытался проверить, работает ли makeInBackground в главной теме, но это тоже не так. Тем не менее, при показе Toast в doInbackground, сбои приложений, которые он должен. Модификация TextView также должна была повредить приложение. Может кто-нибудь объяснить это поведение?
PS - Что касается возможного дубликата, я запускаю код на pre lollipop, поэтому вопрос, а также выбранный ответ не относятся к этому. Также ответ предполагает, что изменение TextView приведет к сбою при последующих вызовах (18-й точнее, в случае выбранного ответа). Я обновил код, чтобы изменить TextView в цикле из 1000 итераций, и он все еще работает нормально.
Это странно, но переменная tv даже не является окончательной, как вы можете получить к ней доступ из внутреннего класса. – dsharew
Это действительно странно, если это происходит на самом деле! – Skynet
Каков ваш выход журнала при сбое приложения? – barq