如何在联网时在另一个类的 ExecutorService.execute() 与 ExecutorService 之间共享数据。安卓

问题描述 投票:0回答:1

对于上下文,我正在制作一个应用程序,它与当前托管在我的本地电脑上的 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() 函数获取一些值

java android executor
1个回答
0
投票

简单地使其成为事件驱动的,就像 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
要么让活动类实现它,要么匿名(就地)实现:

1.让活动类实现

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

2.实施到位

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

另外我想提醒您,如果您从后台线程调用侦听器方法,并且您想要修改某些 UI 元素,那么您应该在主线程中执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.