对于上下文,我正在制作一个应用程序,它与当前托管在我的本地电脑上的 TCP 服务器进行通信。我使用
SSLSocket
进行安全连接。所有通讯都正常。我创建了一个特殊的类来处理与服务器的所有通信。我知道我必须在后台线程上执行此操作,因此我已经在类中初始化了 ExecutorService 和 Handler。在解释问题之前,先展示一下该类的代码以及调用它的时间。
交流课程:-
private ExecutorService executor = Executors.newSingleThreadExecutor();
private Handler handler = new Handler(Looper.getMainLooper());
public String genAuthToken(String userName, String passwd) throws Exception{
if(!connected)return null;
JSONObject json = new JSONObject();
json.put("func","genAuthToken");
json.put("userName",userName);
json.put("passwd",passwd);
JSONObject finalJSON = json;
final String[] reply = {""};
pw.println(finalJSON);
reply[0] = scan.nextLine();
json = new JSONObject(reply[0]);
if((int) json.get("code") == 200){
this.authToken = json.get("authToken").toString();
return (String) json.get("authToken");
}
return String.valueOf((int) json.get("code"));
}
MainActivity.java :-
LedGo client = new LedGo();
boolean connected = client.connect("192.168.1.4",1304,cf,()->{},()->{Snackbar.make(view,"Couldn't connect to server",Snackbar.LENGTH_SHORT).setAnchorView(R.id.fab).show();});
String authToken = client.genAuthToken("userName","passwd",true,()->{},()->{});
现在的问题是我想在
authToken
中得到 MainActivity.java
。我知道我无法像上面写的那样得到它,但我想知道如何从ExecutorService
中提取一些数据。我想到了一种选择,即创建一个可以通过 MainActivity
访问的公共变量,但这并不实用,因为应用程序会同时从不同线程发送许多请求。简而言之,我想知道如何从ExecutorService.execute()
中获取变量MainActivity.java
。如果有任何不清楚的地方请告诉我,我将非常感谢您的帮助。
如何从 Android 开发、Java 中的 ExecutorService.execute() 函数获取一些值
简单地使其成为事件驱动的,就像 Android 框架中所做的许多事情一样。
它干净、可靠、无阻塞。
要实现,请创建一个名为
AuthTokenListener
: 的接口
interface AuthTokenListener {
onAuthTokenReady(String authToken)
}
向
AuthTokenListener
方法添加 genAuthToken
参数,并在令牌准备就绪时调用它。请参阅以下片段:
通讯类:
private ExecutorService executor = Executors.newSingleThreadExecutor();
private Handler handler = new Handler(Looper.getMainLooper());
public void genAuthToken(String userName, String passwd, AuthTokenListener listener) throws Exception{
if(!connected)return null;
JSONObject json = new JSONObject();
json.put("func","genAuthToken");
json.put("userName",userName);
json.put("passwd",passwd);
JSONObject finalJSON = json;
final String[] reply = {""};
pw.println(finalJSON);
reply[0] = scan.nextLine();
json = new JSONObject(reply[0]);
if((int) json.get("code") == 200){
this.authToken = json.get("authToken").toString();
return (String) json.get("authToken");
}
// Looks like your token is ready to publish here
// Then invoke the onAuthTokenReady method of the listener so that
// it gets processed in the main activity
listener.onAuthTokenReady(String.valueOf((int) json.get("code")));
}
最后,在您的主要活动中,您应该实现
AuthTokenListener
要么让活动类实现它,要么匿名(就地)实现:
class MainActivity extends AppCompatActivity implements AuthTokenListener {
@Override
void onAuthTokenReady(String authToken) {
// Process the authToken here
}
// Somewhere in your main MainActivity's method
private void mainActivityMethodYouCreateLedGoClient() {
LedGo client = new LedGo();
boolean connected = client.connect("192.168.1.4",1304,cf,()->{},()->{Snackbar.make(view,"Couldn't connect to server",Snackbar.LENGTH_SHORT).setAnchorView(R.id.fab).show();});
client.genAuthToken("userName","passwd", this);
}
}
class MainActivity extends AppCompatActivity implements AuthTokenListener {
// Somewhere in your main MainActivity's method
private void mainActivityMethodYouCreateLedGoClient() {
LedGo client = new LedGo();
boolean connected = client.connect("192.168.1.4",1304,cf,()->{},()->{Snackbar.make(view,"Couldn't connect to server",Snackbar.LENGTH_SHORT).setAnchorView(R.id.fab).show();});
client.genAuthToken("userName","passwd", new AuthTokenListener {
@Override
void onAuthTokenReady(String authToken) {
// Process the authToken here
}
});
}
}
但是我没有看到你在
executor
课程中的任何地方使用过Communication
。