Это может быть глупая идея, но кто-нибудь знает, можно ли получить доступ к одной форме объекта деятельности в других местах?
Чтобы быть конкретным, скажем, если у вас есть активность A (с textView t), и вы создаете нормальный Java-класс B.
В onCreate вы начинаете запускать B для некоторых вычислений, как показано ниже,
public class MyActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t = (TextView)findViewById(R.id.outputtext);
Somejava B = new Somejava();
B.run();
}
}
Есть ли способ для B обновить textView?
Я знаю простой способ (возможно, правильный путь) - вернуть результат из класса B и использовать t.setText(result) в MyActivity, но я просто хочу знать, можно ли обновить текстовое представление в B?
может просто передать действие refernce в b в конструкторе и создать метод в вашей acitivty для обновления textview. если вы используете другой поток, не забываете использовать обработчик или другие способы обновления потока пользовательского интерфейса.
Использовать целевые или общедоступные статические переменные
Для "нормального класса Java" B
я бы работал с interfaces
public interface SomejavaListener{
void onSomejavaFinish(Object result);
}
public class MyActivity implements SomejaveFinish extends Activity {
TextView t;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t = (TextView)findViewById(R.id.outputtext);
Somejava B = new Somejava();
B.run(MyActivity.this); //notice the extra argument!
}
public void onSomejavaFinish(Object result){
t.setText("updated! ^,^");
}
}
public class Somejava {
//...
public void run(SomejavaListener callback){
//working working
callback.onSomejavaFinish( new Object() );
}
}
Однако в отношении среды Android вопрос заключается в том, что у меня появилось ощущение, что AsyncTask будет правильным для вас. У этого есть метод doInBackground
чтобы сделать работу, а не испортить ваш doInBackground
пользовательского интерфейса (в результате чего возникли ошибки ANR). Еще одно преимущество - методы onPreExecute
и onPostExecute
запущены в самом onPostExecute
пользовательского интерфейса, поэтому требуется просто обновить TextView
public class MyActivity extends Activity {
TextView t;
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... void) {
//do your stuff
return null
}
protected void onPostExecute(Void void) {
MyActivity.this.t.setText("updated ^^v");
}
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
t = (TextView) findViewById(R.id.outputtext);
MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();
}
}
Да, возможно, если поле "Активность" является общедоступным и публикует изменения пользовательского интерфейса в public Handler
созданном в первом Activity
но в фактах, это действительно уродливо сделать это...
Вы можете использовать startActivityForResult(...)
чтобы уведомить другое действие о том, как процесс прошел с некоторыми серийными данными в Bundle extras
для Intent и уловил результат в методе overrided
onActivityResult(...)
...