1

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

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

4 回答 4

1

使用 Intent 或公共静态变量

于 2012-05-28T11:17:44.503 回答
0

是的,如果 Activity 的字段是公开的,并在第一次public Handler创建时发布 UI 更改,Activity但事实上,这样做真的很难看......


您可以使用IntentstartActivityForResult(...)中的一些可序列化数据通知其他活动流程如何​​通过,并在方法Bundle extras中捕获结果...overridedonActivityResult(...)

于 2012-05-28T11:21:26.530 回答
0

可以简单地将活动引用传递给构造函数中的 b 并在您的活动中创建方法来更新 textview。如果您使用另一个线程并没有忘记使用处理程序或其他方式来更新 UI 线程。

于 2012-05-28T11:25:51.650 回答
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 错误)。另一个优点是这些方法再次在 UI 线程中运行onPreExecuteonPostExecute因此只需眨眼即可更新您的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();
  }
}
于 2012-05-28T11:29:50.103 回答