android - gomobile 回调(将实时下载的内容转发到 android)?

标签 android go gomobile

我正在研究如何使用 gomobile 开发 android sdk,这是我的用例:

sdk 将处理文件下载并将其实时接收的内容发送到andoird,这怎么可能呢?

我尝试过这样的事情,返回一个 ReadCloser,然后 android 将从这个流中读取:

func DownloadFile(url string) (io.ReadCloser, error) {
    // download the file
    resp, err := http.Get(url)
    if err != nil {
        return nil, err
    }

    if resp.StatusCode != http.StatusOK {
        err = errors.New(fmt.Sprintf("requesrting url [%s] error [%s]!", url, resp.Status))
        return nil, err

    }

    return resp.Body, nil
}

但是从编译的java类中,甚至没有这个方法,为什么?

我试图返回一个 channel ,但结果相同,而不是在目标 java 类中编译的事件。

有没有更好的方法来做到这一点? gomobile是否支持回调(go sdk调用android注册的这个回调)?我几乎找不到有关该回调用法的任何文档。

最佳答案

经过一番谷歌搜索,我发现了一些有用的信息,这里有一个很好的介绍。

https://talks.madriguera.me/2016/gomobile.slide#17

最后,我使我的代码工作:

// define call back interface
type Downloader interface {
    Forward(content []byte)
}

// callback instance
var downloader Downloader

// save the callback instance
func RegisterCallback(c Downloader) {
    downloader = c
}

func Download(url string) error {
    // download the file
    resp, err := http.Get(url)
    if err != nil {
        return err
    }

    if resp.StatusCode != http.StatusOK {
        err = errors.New(fmt.Sprintf("requesrting url [%s] error [%s]!", url, resp.Status))
        return err
    }

    defer resp.Body.Close()
    buf := make([]byte, 256)
    copyBuffer(resp.Body, buf)
    return nil
}

func copyBuffer(src io.Reader, buf []byte) (err error) {
    for {
        nr, er := src.Read(buf)
        if nr > 0 {
            content := buf[0:nr]
            // callback
            downloader.Forward(content)
        }
        if er == io.EOF {
            break
        }
        if er != nil {
            err = er
            break
        }
    }
    return nil
}

在Android中,我只是实现了转发接口(interface),然后效果很好:
// remember call registerCallback() first

@Override
public void forward(byte[] bytes) {
    System.out.println("--------------");
    System.out.println(new String(bytes));

}

关于android - gomobile 回调(将实时下载的内容转发到 android)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41607634/

相关文章:

c - 空指针的 Golang 等价物是什么

go - 使用Go创建链接列表

Golang - 用于结构返回类型跨平台 slice 的 GoMobile 工具

ios - 带有 "PIE disabled"/i386 arch 的 Gomobile 绑定(bind)生成库

java - 消息为 "Connection timed out"的 ConnectionTimeoutException 和 SSLException 之间的区别

android - Windows Phone 8 等同于 Android 的 StartActivityForResult

java - 使用服务时未找到 Activity

android - 媒体播放器同时播放多个文件

go - 带有 AMQP 的 Golang 中的 JSON RPC

macos - 总是 -bash : gomobile: command not found