如何在Android Java插件端等待异步操作(任何I / O)? - java

对于统一游戏,我需要在android-plugin中使用库来发送websocket请求。我发现我不知道如何让C#代码等待android插件中的异步操作!
我提供了一个概念证明案例(带有简单的http get请求),以简单的方式询问我的问题。这是我的无效代码:

package com.example.plug2unity1;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Plug1Class {
  static OkHttpClient client = new OkHttpClient();
  static String doGetRequest(String url) throws IOException {
    Request request = new Request.Builder()
            .url(url)
            .build();

    Response response = client.newCall(request).execute();
    return response.body().string();
  }
  public static String GetPlug2Text() throws IOException {
    String res = "";
    try {
        res = doGetRequest("http://www.google.com");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return res;
  }
}

Unity脚本必须调用插件:

void Start () {
    TextMesh txtm = GetComponent<TextMesh> ();
    var plugin = new AndroidJavaClass("com.example.plug2unity1.Plug1Class");
    txtm.text = plugin.CallStatic<string>("GetPlug1Text");
}

编辑:
问题是“不是”如何进行http调用,很明显,我可以从c#中做到这一点,我想学习“ c#如何等待插件的异步操作结果,无论是http调用还是I / O操作,与我们通过javascript中的“承诺”进行操作的方式相同。

结果:
我的TextMesh不会更改文本,而如果我在插件方面进行POC时没有任何异步操作,则它可以工作。我怎样才能使它工作?

参考方案

使用回调执行此操作。从C#调用Java函数。在Java函数中,启动新线程以执行该任务。该任务完成后,请执行从Java到C#的回调,以使您知道任务已完成。

C#示例代码:

void makeRequestOnJava() 
{
    TextMesh txtm = GetComponent<TextMesh> ();
    var plugin = new AndroidJavaClass("com.example.plug2unity1.Plug1Class");
    txtm.text = plugin.CallStatic<string>("GetPlug1Text");
}

//Will be called from C# when the request is done
void OnRequestFinished()
{

}

然后,在Java端,当您的任务完成时,使用UnityPlayer.UnitySendMessage调用C#端的OnRequestFinished函数。

UnityPlayer.UnitySendMessage("GameObjectName", "OnRequestFinished", null);

您可以了解如何设置和使用UnityPlayer.UnitySendMessage功能here。

什么时候在Hibernate中调用flush()和commit()? - java

我有以下情况: openSession() tx = session.beginTransaction(); try { ... session.saveOrUpdate(obj_1); ... session.saveOrUpdate(obj_2); ... session.saveOrUpdate(obj_3); session.flush(); tx.…

无法从上下文访问getContentResolver()? - java

我有两个类,MainActivity和DoHardWork。 DoHardWork扩展了AsyncTask,在该类中,我需要访问上下文以获取contentResolver并进行查询。没问题吧?让我们将其作为参数传递给DoHardWork: Context currCont = this; new DoHardWork(currCont).execute();…

如何在过滤器()java8中使用peek()? - java

我有一个LinkedHashMap。sorted:{0=[1, 2], 5=[4, 3], 1=[2, 0, 3], 2=[4, 0, 1], 3=[4, 5, 1], 4=[5, 2, 3]} 我尝试根据其大小过滤每个键的值。例如对于条目2=[4, 0, 1],我需要过滤值,以便键只能具有其大小大于或等于(>=)的值。考虑2=[4, 1]:由于0只有…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…