React原生Android地理位置无法返回 - 死线程

时间:2016-06-02 03:46:31

标签: android react-native

在React Native中在Android上获取用户位置时遇到问题 我已经设置了正确的权限,并且正在获取位置,但它没有回到我的组件。在日志中看到以下内容

 W/MessageQueue: Handler (android.location.LocationManager$ListenerTransport$1) {6456d95} sending message to a Handler on a dead thread
                                                           java.lang.IllegalStateException: Handler (android.location.LocationManager$ListenerTransport$1) {6456d95} sending message to a Handler on a dead thread
                                                               at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
                                                               at android.os.Handler.enqueueMessage(Handler.java:631)
                                                               at android.os.Handler.sendMessageAtTime(Handler.java:600)
                                                               at android.os.Handler.sendMessageDelayed(Handler.java:570)
                                                               at android.os.Handler.sendMessage(Handler.java:507)
                                                               at android.location.LocationManager$ListenerTransport.onLocationChanged(LocationManager.java:248)
                                                               at android.location.ILocationListener$Stub.onTransact(ILocationListener.java:58)
                                                               at android.os.Binder.execTransact(Binder.java:461)

使用react-native 0.25.01,targetSdk 23

关于为什么会发生这种情况的任何想法?会喜欢一些输入:) 我的实现只是来自文档(http://facebook.github.io/react-native/docs/geolocation.html#content

的复制粘贴

2 个答案:

答案 0 :(得分:0)

我不确定这对你有多大帮助,但我已经创建了一个适用于Android(Genymotion Emulator)的示例。

它在react-native 0.26.3上运行,你可以在GitHub上看到https://github.com/AidenMontgomery/react-native-sample

我从未见过您所遇到的实际错误,但我知道有一个有效的例子可以帮助我解决问题。

答案 1 :(得分:0)

为了后代,请使用以下npm软件包,该软件包最近在ReactNative 0.60.4中进行了测试。

import Geolocation from 'react-native-geolocation-service';

请确保请求位置服务权限,该权限应为:

    //Request location permission
    async componentWillMount(){
        try {
            await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION);
        } catch (err) {
            console.warn(err);
        }
    }

定义一个异步函数来提取当前位置。

 _mapLocation = async () => {
        await Geolocation.getCurrentPosition(
            position => {
                var x: LatLng = {
                    latitude: position.coords.latitude,
                    longitude: position.coords.longitude,
                };

                //Here I am collecting gps coordinates in a collection.
                var tempMarkers = this.state.markers;
                tempMarkers.push({latlng: x, title: '', description: ''});
                this.setState({markers: tempMarkers});
            },
            error => {
                console.warn(error.message);
            },
            { enableHighAccuracy: true, timeout: 20000, maximumAge: 10000 }
        )
    }

最后是一个如何执行新创建的异步函数的示例:

<Button title='Map Location' type='solid' onPress={() => this._mapLocation()} />