从消息处理程序开始异步任务

3
我在我的应用中有一个 GPS 类。在 onLocationChanged 方法中,我会向我的活动发送一个 handler 消息,该消息应执行一个异步任务。如果我从活动的任何位置调用它,我的异步任务本身就可以正常运行,但是当通过 handler 调用它时,我一直在遇到崩溃。我确定这与我如何从 handler 启动任务有关。
这是我的活动片段中的 handler,它应该启动异步任务。
  public Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      Log.d("MainMenu_NearbyFragment", "handler recieved for on location changed");
      if (!sortingPlaces) {
        getActivity().runOnUiThread(new Runnable() {
          @Override
          public void run() {
            new sortNearby().execute();
          }
        });
      }
    }
  };

我正在使用onLocationChanged方法将消息发送到处理程序,方法如下:
  public void onLocationChanged(Location location) {
    new MainMenu_NearbyFragment().handler.sendEmptyMessage(0);
  }

编辑:

在实际设备上运行后,这是一个堆栈跟踪。 (之前是在模拟器上运行的,这是我一开始没有意识到的不同消息)。

java.lang.NullPointerException
at  badams.android.alcology.fragments.MainMenu_NearbyFragment$1.handleMessage(MainMenu_NearbyFragment.java:43)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

第43行是:
getActivity().runOnUiThread(new Runnable() {

我这样做的原因是因为我需要检测实现了LocationListener接口的活动之外的位置变化。所以我的想法是,在onLocationChanged中向我的活动发送一条消息,通知它更新。也许这不是我解决问题的正确方式?


1
你的AsyncTask的107行是什么? - FoamyGuy
请分享更多的代码以便更好地理解。 - Akhil
更新了来自实际硬件设备的堆栈跟踪。虽然是不同的错误,但我宁愿在硬件上使其工作而不是模拟器上。 - Badams
你是否检查过getActivity()方法返回的是一个Activity对象还是null?这可能是因为该Fragment未附加到Activity上。 - Sandeep Dhull
2个回答

1
我最终通过使用

使其工作。
handler.post(new Runnable()

代替

getActivity().runOnUiThread(new Runnable() 

看起来异步任务已经启动了! 当从处理程序调用异步任务时,异步任务无法正常工作,但这与此问题无关。 我真的不明白为什么它起作用,但它确实起作用。


0

使用

MainMenu_NearbyFragment.this.getActivity().runOnUiThread(new Runnable() {

而不是

getActivity().runOnUiThread(new Runnable() {

应该可以运行。


尝试了这个方法,但从堆栈跟踪中仍然得到了相同的结果。非常感谢您的帮助。 - Badams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接