如何访问 Android 中的 activity 对象

How to access the activity object in Android

MainActivity.java

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Client client = new Client();
    try {
        client.connect("192.168.1.10",5555);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

   public void displayServerAnswer(String answer){
        TextView textView = (TextView)findViewById(R.id.mainTextView);
        textView.setText(answer);
    }
...

Client.java

import java.net.Socket;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Observable;


public class Client extends Observable implements Runnable {

  private Socket socket;
  private BufferedReader br;
  private PrintWriter pw;
  private boolean connected;
  private int port=5555; //default port
  private String hostName="localhost";//default host name

  public Client() {
        connected = false;
  }

  public void connect(String hostName, int port) throws IOException {
      if(!connected)
      {
         this.hostName = hostName;
         this.port = port;
         socket = new Socket(hostName,port);
         //get I/O from socket
         br = new BufferedReader(new         InputStreamReader(socket.getInputStream()));
         pw = new PrintWriter(socket.getOutputStream(),true);

           connected = true;
         //initiate reading from server...
         Thread t = new Thread(this);
         t.start(); //will call run method of this class
      }
  }

  public void sendMessage(String msg) throws IOException
  {
        if(connected) {
            pw.println(msg);
      } else throw new IOException("Not connected to server");
  }

  public void run() {
       String msg = ""; //holds the msg recieved from server
       try {
          while(connected && (msg = br.readLine())!= null)
          {
             //In Here I want to call MainActivity.displayServerAnswer()

             //notify observers//
             this.setChanged();
//notify+send out recieved msg to Observers
                 this.notifyObservers(msg);
          }
       }
       catch(IOException ioe) { }
       finally { connected = false; }
  }

...
}

在我指定的地方,我希望能够显示服务器答案。 我怎样才能访问创建客户端对象的 MainActivity 实例,以便调用它的方法?

您可以在构造函数或设置访问器方法中将活动引用传递给您的客户端。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Client client = new Client(this);
    try {
        client.connect("192.168.1.10",5555);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

并且在您的 java 对象中:

MainActivity activity;

public Client(MainActivity activity) {
    connected = false;
    this.activity = activity;
}
...

public void run() {
       String msg = ""; //holds the msg recieved from server
       try {
          while(connected && (msg = br.readLine())!= null)
          {
             //In Here I want to call MainActivity.displayServerAnswer()
             activity.displayServerAnswer();

             //notify observers//
             this.setChanged();
             //notify+send out recieved msg to Observers
             this.notifyObservers(msg);
          }
       }
       catch(IOException ioe) { }
       finally { connected = false; }
  }

如何将 activity 实例作为参数传递给客户端的构造函数?

// MainActivity
Client client = new Client(this);

// Client
public Client(Activity activity) {
  this.activity = activity;
  connected = false;
}

@hopia 回答的不错。您还可以实施 Listener Design pattern

public class Client extends Observable implements Runnable {

    public interface ClientListener {
        public void onAction();
    }

    private ClientListener mListener;

    public Client(ClientListener listener) {
         mListener = listener;
    }

   public class MainActivity extends ActionBarActivity implements ClientListener {

         @Override
         public void onAction(){
              ....do whatever you need
         }
   ...
   }