Принятый ответ на самом деле серьезно устарел. В Android Studio 3.x.x нет необходимости создавать дополнительную папку макета (в любом случае я не уверен, что это было необходимо).
Также нет необходимости менять масштаб проекта с Android на Project, как вам говорит принятый ответ.
Также нет необходимости редактировать какие-либо атрибуты и режимы пользовательского интерфейса, как говорится в принятом ответе.
Всего 2 шага:
1) Откройте базовый макет пользовательского интерфейса в режиме ДИЗАЙН , чтобы вы могли видеть фактический графический интерфейс пользователя, например кнопки, значки и т. Д. это как текст, в режиме просмотра кода XML).
2) Щелкните значок, отмеченный на снимке экрана ниже, и в меню выберите Создать изменение ландшафта (помечено на скриншоте как «Нажмите 2-й»).
Затем Studio делает всю работу за вас, и это работает как шарм. Нет необходимости добавлять дополнительный код и дополнительные папки не создаются.
Наслаждайтесь.
Android Studio 3.1.4:
Если B
реализует Remote
, его можно экспортировать и передать как параметр в вызове RMI к A
. В этом сценарии нет необходимости регистрировать B
в реестре RMI, поскольку клиенту явно передается ссылка на него.
Прошло некоторое время с тех пор, как я использовал RMI, но IIRC, если класс B реализует java.rmi.Remote
и передает ссылку на свой экземпляр в качестве параметра к методу в классе A, тогда класс A должен получить заглушку, и методы, вызываемые из него, будут вызываться в исходном экземпляре.
Однако, если у вас есть много таких RMI-вызовов, возвращающихся и оттуда, вы, вероятно, столкнетесь с проблемы с производительностью.
Если вы передаете B
в качестве аргумента методу в A
, а затем используете эту ссылку для вызова метода в B
] Я вполне уверен, что установлено обратное соединение, и я вполне уверен, что реестр RMI создается для JVM, где находится B
. В какой-то момент у нас возникли проблемы с особенно строгими правилами брандмауэра. Наш код выглядел примерно как
Веб-сервер
public int uploadFile(FileItem fileItem){
return ApplicationClassLoader
.get(DocumentManager.class)
.attachFile(new RemoteInputStreamImpl(fileItem.getInputStream());
)
}
Сервер приложений
public int attachFile(RemoteInputStream in){
...
byte[] buffer;
while((buffer = in.read(1024)) != null) // Would return null to indicate EOF
// Do some stuff
return documentId;
}
Но как класс B узнает о классе A без второго сервера RMI? Думаю, вам понадобятся два сервера.
Некоторые службы RMI поддерживают обратные вызовы или прослушиватели, которые позволяют серверу асинхронно вызывать клиента по тому же соединению. (Извините, я не помню названия открытых библиотек, которые это делают, быстрый поиск в Google не очень помог) Стандартный RMI не поддерживает это, вместо этого вам также необходимо предоставить клиент как службу RMI.
Обе JVM должны будут реализовать службы RMI. Но на самом деле очень легко взглянуть на различные классы в java.rmi.
Чего вы не можете сделать, так это каким-то образом использовать одно соединение RMI и осуществлять двустороннюю связь.
RMI bidirectional:
SERVER:
import java.io.IOException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class RMISERVER {
public RMISERVER() throws IOException {
Thread t;
try {
t = new Prou_run();
t.start();
} catch (RemoteException ex) {
Logger.getLogger(RMISERVER.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String args[]) throws IOException {
new RMISERVER();
}
}
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.registry.Registry;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.tree.DefaultMutableTreeNode;
//extends java.rmi.server.UnicastRemoteObject
public class Prou_run extends Thread implements Runnable{
New_Object root = null,root2=null,root3=null,root4=null,root5;
New_Object new_root=null;
Object xt = null, xt2=null , xt3=null;
Registry r1,r2;
RMIClientSocketFactory csf,csf2;
RMIServerSocketFactory ssf,sf2;
new_Patryk npal;
public Prou_run() throws java.rmi.RemoteException, IOException
{
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
// csf = new RMIClientSocketFactory() {
//
// public Socket createSocket(String host, int port) throws IOException {
// return new Socket("rmi://localhost/getchil",1080);
// }
// };
// csf2 = new RMIClientSocketFactory() {
//
// public Socket createSocket(String host, int port) throws IOException {
// return new Socket("rmi://localhost/getchild",1081);
// }
// };
// ssf=new RMIServerSocketFactory() {
//
// public ServerSocket createServerSocket(int port) throws IOException {
// return new ServerSocket(1099);
// }
// };// ssf.createServerSocket(1099);
// sf2=new RMIServerSocketFactory() {
//
// public ServerSocket createServerSocket(int port) throws IOException {
// return new ServerSocket(1098);
// }
// };//sf2.createServerSocket(1098);
try {
r1=java.rmi.registry.LocateRegistry.createRegistry(1098);
r2=java.rmi.registry.LocateRegistry.createRegistry(1099);//, csf2, ssf);
java.rmi.registry.LocateRegistry.createRegistry(1097);
java.rmi.registry.LocateRegistry.createRegistry(1095);
java.rmi.registry.LocateRegistry.createRegistry(1096);
System.out.println("RMI registry ready.");
} catch (Exception e) {
System.out.println("Exception starting RMI registry:");
e.printStackTrace();
}
this.xt = null;this.xt2 = null;this.xt3 = null;
npal = new new_Patryk();
System.out.println("sdmmmfxxxxxxxx");
}
public void run() {
//while(true){
try{
// root = new_root;
// xt=npal.getChild((File)new_root.getob(), (int)new_root.geti());
New_ObjectIMPL sl = new New_ObjectIMPL();
sl.i=354;
System.out.println("sdmmmf2");
//r2
Naming.rebind("rmi://localhost:1099/getchild",(New_Object) sl);
System.out.println("sdmmmf3");
}catch (Exception e) {
System.out.println("Trouble: " + e);
}
while(new_root==null){
try{
//System.out.println("sdmmmf1" + new_root.geti());
new_root = (New_Object) Naming.lookup("rmi://localhost:1080/getchil");
System.out.println("sdmmmf1" + new_root.geti());
}catch (Exception e) {
System.out.println("Trouble: " + e);
}
}
}
}
/**
*
* @author austinchuma
*/
public interface New_Object extends java.rmi.Remote {
public int geti() throws java.rmi.RemoteException;
public Object getob() throws java.rmi.RemoteException;
public Object getobchild() throws java.rmi.RemoteException;
public boolean getbbol() throws java.rmi.RemoteException;
public byte[] getb() throws java.rmi.RemoteException;
}
public class New_ObjectIMPL extends java.rmi.server.UnicastRemoteObject implements New_Object
{
Object ob = null,obchild = null;
int i=0;
boolean bol = false;
byte[] b = null;
public New_ObjectIMPL() throws RemoteException{
ob = null;obchild = null;
i=0;
bol = false;
b = null;
}
public int geti() throws RemoteException {
return i;
}
public Object getob() throws RemoteException {
return ob;
}
public Object getobchild() throws RemoteException {
return obchild;
}
public boolean getbbol() throws RemoteException {
return bol;
}
public byte[] getb() throws RemoteException {
return b;
}
}