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

时间:2018-03-03 20:25:59

标签: java c# android unity3d asynchronous

对于统一游戏,我需要在android-plugin中使用libs来发送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");
}

修改 问题是&#34;不是&#34; 如何进行http调用,显然从c#我可以做到,我想学习&#34; c#如何等待异步来自插件的操作结果,无论是http调用还是I / O操作,我们通过&#34; promises&#34;在javascript中。

结果:
我的TextMesh不会更改文本,而如果我在插件方面没有任何异步执行POC,则可以正常工作。我怎么能让这个工作?

1 个答案:

答案 0 :(得分:1)

使用回调来执行此操作。从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