是否可以从其他地方访问活动的对象?

时间:2012-05-28 11:15:20

标签: android android-activity

这可能是一个愚蠢的想法,但有人知道是否有可能从其他地方访问一个活动的对象?

具体来说,假设您有一个活动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 ?

4 个答案:

答案 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错误。) 另一个优点是onPreExecuteonPostExecute方法再次在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();
  }
}