Jamie
Jamie

Reputation: 35

Is it possible to access an object of an activity fom other place?

This maybe a stupid idea, but does anyone know is it possible to access one activity's object form other places?

To be specific, lets say if you have an activity A (with a textView t) and you create a normal java class B.

At onCreate, you start to run B for some calculation like below,

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();
  }
}

Is there a way for B to update the textView?

I know the simple way (maybe the correct way) is to return the result from B class and use t.setText(result) in MyActivity, but I'm just want to know is it possible to update the textview in B?

Upvotes: 1

Views: 92

Answers (4)

nuala
nuala

Reputation: 2688

For a "normal java class" B I would work with 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() );
    }
}

However in respect to the android environment the question is sitting in I got the feeling maybe an AsyncTask would be the right thing for you. It has an doInBackground method to do work and not spoiling your UI Thread (resulting in ANR Errors.) Another advantage is the onPreExecute and onPostExecute methods are running in the UI Thread itself again, so it just takes a blink to update your 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();
  }
}

Upvotes: 0

Dheeresh Singh
Dheeresh Singh

Reputation: 15701

can simply pass activity refernce to b in constructor and create the method in your acitivty to update textview. if you using another thread not forgot to use handler or other ways to update UI thread.

Upvotes: 0

ChristopheCVB
ChristopheCVB

Reputation: 7315

Yes, it is possible if the Activity's field is public and post the UI changes in a public Handler created on the first Activity but in facts, it's really ugly to do that...


You can use startActivityForResult(...) to notify an other activity how the process has passed with some serialiezable data in the Bundle extras of the Intent and catch the result in the overrided method onActivityResult(...)...

Upvotes: 0

Bob
Bob

Reputation: 23000

Use Intent or public static variables

Upvotes: 1

Related Questions