GoMobile 回调(将实时下载的内容转发到 Android)



我正在研究如何使用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类来看,甚至没有这种方法,为什么?

我试图返回一个通道,但它是相同的结果,而不是在目标 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中,我只是实现了前向接口,然后它运行良好:

// remember call registerCallback() first
@Override
public void forward(byte[] bytes) {
    System.out.println("--------------");
    System.out.println(new String(bytes));
}

最新更新