asynctask从处理程序调用时没有获得arraylist

时间:2013-04-18 03:30:36

标签: java android android-asynctask android-handler

我正在使用一个处理程序来启动asynctask但是在这样做时,我的应用程序崩溃了。我被卡住的原因是因为如果我通过其他任何东西(例如onClickListener)启动asynctask,那么我可以反复运行它多次,并且它每次都能完美运行。一旦我从我的处理程序执行asynctask,就会立即使用NullPointerException崩溃应用程序。

我的处理程序看起来像这样

  public Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
        handler.post(new Runnable() {
          @Override
          public void run() {
            new sortNearby().execute();
          }

        });
    }
  };

以下是显示异常

的应用程序的堆栈跟踪的一部分
Caused by: java.lang.NullPointerException
at badams.android.app.fragments.MainMenu_NearbyFragment$sortNearby.doInBackground(MainMenu_NearbyFragment.java:100)

我的代码的第100行是doInBackground

下的asynctask中的第一行
protected String doInBackground(String... args) {
  for (int i = 0; i < global.places.size(); i++) { //this is line 100

我理解异常很可能来自“global.places.size()”可能是null,但是我坚持为什么只有在从处理程序调用时才这样做,因为如果我开始它就可以正常工作来自我代码的任何其他部分的任务。

修改

根据@Raghunandan的要求,这里是我的asynctask中doInBackground的整个代码块,它计算“地点”和用户之间的距离:

class sortNearby extends AsyncTask<String, Place, String> {
protected String doInBackground(String... args) {
  for (int i = 0; i < global.places.size(); i++) { //THIS IS LINE 100
    Location locationA = new Location("place");
    locationA.setLatitude(global.places.get(i).getLatitude());
    locationA.setLongitude(global.places.get(i).getLongitude());
    Location locationB = new Location("user");
    locationB.setLatitude(global.applicationLocationManager.getLatitude());
    locationB.setLongitude(global.applicationLocationManager.getLongitude());
    float dist = locationA.distanceTo(locationB);
    dist = dist / 1000;
    global.places.get(i).setDistance(dist);
  }
  return null;
}

编辑2

global是一个扩展Application的类,在Activity中定义如下:

global = (ApplicationGlobal) getActivity().getApplicationContext();

1 个答案:

答案 0 :(得分:0)

如果NullPointerException位于第100行,则globalglobal.places将返回null

您是否尝试过调试?

调试将帮助您了解正在发生的事情。

同样来自处理程序,我看不到你的doInBackground方法是如何被调用的?

global变量在哪里定义?它何时何地初始化?