在runOnFirstFix中获取异常

时间:2012-09-19 17:15:00

标签: android multithreading toast runnable

我收到以下异常

09-19 18:09:36.551: E/AndroidRuntime(20608): FATAL EXCEPTION: Thread-2852
09-19 18:09:36.551: E/AndroidRuntime(20608): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
09-19 18:09:36.551: E/AndroidRuntime(20608):    at android.os.Handler.<init>(Handler.java:121)
09-19 18:09:36.551: E/AndroidRuntime(20608):    at android.widget.Toast$TN.<init>(Toast.java:317)
09-19 18:09:36.551: E/AndroidRuntime(20608):    at android.widget.Toast.<init>(Toast.java:91)
09-19 18:09:36.551: E/AndroidRuntime(20608):    at android.widget.Toast.makeText(Toast.java:233)
09-19 18:09:36.551: E/AndroidRuntime(20608):    at com.mid.nash.activity.MapPageFragment$3$1.run(MapPageFragment.java:156)
09-19 18:09:36.551: E/AndroidRuntime(20608):    at java.lang.Thread.run(Thread.java:856)

以下是我的代码

myLocationOverlay.runOnFirstFix(new Runnable() {
    public void run() {
        //check if the location is within boundaries. 
        GeoPoint currentlocation = myLocationOverlay.getMyLocation();
        double latitude = (currentlocation.getLatitudeE6() / 1E6);
        double longitude = (currentlocation.getLongitudeE6() / 1E6);
        //check if user is witin boundry of Kew
        if (latitude <= RESTRICTED_UPPERLEFT_LAT && 
                latitude >= RESTRICTED_BOTTOMRIGHT_LAT && 
                longitude >= RESTRICTED_UPPERLEFT_LNG && 
                longitude <= RESTRICTED_BOTTOMRIGHT_LNG){
            mapController.animateTo(myLocationOverlay.getMyLocation());
        } else {
            myLocationOverlay.disableMyLocation();
            Toast.makeText(getActivity(), "You are out of scope.", Toast.LENGTH_LONG);
        }
    }
});

我提到this link认为这可能对我有所帮助。但我无法实现上述方法。

如何摆脱这种异常?

2 个答案:

答案 0 :(得分:1)

问题是Runnable正在一个没有Looper的帖子上执行,而Toast是发布Handler所必需的。您需要做的是在MapPageFragment中创建一个Toast,您可以发送消息给它以显示Toast。或者根本不使用{{1}},您可以实现更好的通知UI。

答案 1 :(得分:1)

我建议将Toast从Runnable中移出。

应该在主线程中使用其他UI元素调用Toast。昨天我遇到了一个问题,即后台线程被破坏而Toast从未关闭。它出现在主屏幕和其他任何地方,直到我强行删除应用程序的缓存内存... Toast很好但保留在主线程上。

作为一个注释,你不要打电话给show(),所以Toast现在不会做任何事......