Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中访问activity对象_Java_Android_Client - Fatal编程技术网

Java 如何在Android中访问activity对象

Java 如何在Android中访问activity对象,java,android,client,Java,Android,Client,MainActivity.java public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Client client = new Clien

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实例以调用其方法?

您可以通过构造函数或set accessor方法向客户端传递acvtivity引用

@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; }
  }

您可以通过构造函数或set访问器方法将acvtivity引用传递给客户端

@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; }
  }

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

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

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

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

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

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

@霍皮亚的回答很好。您还可以实现侦听器设计模式


@霍皮亚的回答很好。您还可以实现侦听器设计模式


我喜欢这个更通用的解决方案,它使客户机对象独立于MainActivity。我喜欢这个更通用的解决方案,它使客户机对象独立于MainActivity。