gomobile 回调(将实时下载的内容转发到 android)?
gomobile callback (forward realtime downloaded content to android)?
我正在研究如何使用 gomobile 开发 android sdk,这是我的用例:
sdk会处理文件下载,并将实时接收到的内容发送给andoird,这是怎么做到的?
我试过这样的东西,return 一个 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
}
但是从编译的javaclass来看,连这个方法都没有,为什么?
并且我尝试return一个通道,但结果是一样的,不是在目标中编译的事件java class。
有更好的方法吗? gomobile是否支持回调(go sdk call this callback by android registered)?我几乎找不到关于该回调用法的任何文档。
经过一番谷歌搜索,我找到了一些有用的信息,这里是一个很好的介绍。
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中,我只是实现了forward接口,然后效果很好:
// remember call registerCallback() first
@Override
public void forward(byte[] bytes) {
System.out.println("--------------");
System.out.println(new String(bytes));
}
我正在研究如何使用 gomobile 开发 android sdk,这是我的用例:
sdk会处理文件下载,并将实时接收到的内容发送给andoird,这是怎么做到的?
我试过这样的东西,return 一个 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
}
但是从编译的javaclass来看,连这个方法都没有,为什么?
并且我尝试return一个通道,但结果是一样的,不是在目标中编译的事件java class。
有更好的方法吗? gomobile是否支持回调(go sdk call this callback by android registered)?我几乎找不到关于该回调用法的任何文档。
经过一番谷歌搜索,我找到了一些有用的信息,这里是一个很好的介绍。
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中,我只是实现了forward接口,然后效果很好:
// remember call registerCallback() first
@Override
public void forward(byte[] bytes) {
System.out.println("--------------");
System.out.println(new String(bytes));
}