这可能是一个愚蠢的想法,但有人知道是否有可能从其他地方访问一个活动的对象?
具体来说,假设您有一个活动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类返回结果并在MyActivity中使用t.setText(result),但我只是想知道是否可以更新B中的textview ?
答案 0 :(得分:1)
使用Intent或公共静态变量
答案 1 :(得分:0)
是的,如果活动的字段是公开的,并且在第一个public Handler
创建的Activity
中发布了UI更改,则可能会发生这种情况,但事实上,这样做真的很难......
您可以使用startActivityForResult(...)
通知其他活动如何通过Intent Bundle extras
中的一些可序列化数据传递进程,并在overrided
方法{{1}中捕获结果}} ...
答案 2 :(得分:0)
可以在构造函数中简单地将活动引用传递给b,并在您的acitivty中创建方法来更新textview。如果你使用另一个线程,不要忘记使用处理程序或其他方式来更新UI线程。
答案 3 :(得分:0)
对于“普通的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
方法来完成工作而不会破坏你的UI线程(导致ANR错误。)
另一个优点是onPreExecute
和onPostExecute
方法再次在UI线程中运行,因此只需要眨眼就可以更新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();
}
}