0

Я столкнулся с ошибкой, которую я не могу понять для жизни меня. У меня есть слушатель, который вызывает вызов webservice и заполняет статические arraylists из двух других классов practiceRoundListActivity и qualifierRoundListActivity. Итак, в коде ниже, в цикле foreach у меня есть два условия, которые определяют, какой arraylist событие будет вставлено. Первое условие «praciticeRoundListActivity.values ​​...» отлично работает, но вызов «qualifierRoundListActivity.values ​​...» не работает, и я получаю исключение с нулевым указателем.Исключение null-указателя Android при доступе к статическому arraylist

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    if (arg2 != 0) { 
     String name = (String) arg0.getItemAtPosition(arg2); 
     Log.d(TAG, name); 
     Team team = SpectatorActivity.map2.get(name); 
     Log.d(TAG, team.getGSID()); 
     String url = "http://qualifiers.golfstat.com/webservices/remote.cfc?method=getEventsByGSID&GSID="; 
     url += team.getGSID(); 
     wt.execute(url, team); 
     //practiceRoundListActivity.values = new ArrayList<String>(); 
     //qualifierRoundListActivity.values2 = new ArrayList<String>(); 
     for(Event event : team.getEvents()) { 
      if(event.getType() == 'p') { 
       Log.d(TAG, "PR found"); 
       practiceRoundListActivity.values.add(event.getEventDescription() + " " + event.getTournamentDescription()); 
      } else if(event.getType() == 'q') { 
       Log.d(TAG, "QR found"); 
       // //HERE IS THE BUG qualifierRoundListActivity.values.add(event.getEventDescription() + " " + event.getTournamentDescription()); 
      } 
     } 
     tabHost.setCurrentTab(1); 
     tabHost.setVisibility(0); 
    } 
} 

Будучи список мероприятий, practiceRoundListActivity и qualifierRoundListActivity прикреплены к arrayadapter, который будет отображаться. Я исчерпал каждую идею, чтобы что-то узнать, что-то о том, почему это происходит. Совсем недавно, поскольку practiceRound ... и qualifierRound ... настолько похожи, я скопировал код для практикиRound ... class в qualifierRound ... и изменил все необходимые имена на quailifierRound ... (Я знаю, что эти имена классов досадно длинный). Спасибо заранее за любую помощь.

public class qualifierRoundListActivity extends ListActivity { 

static ListView listView; 
ArrayAdapter<String> adapter; 
public static ArrayList<String> values; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.round_list); 

    listView = getListView(); 
    values = new ArrayList<String>(); 
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values); 
    listView.setAdapter(adapter); 
    listView.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      // TODO Auto-generated method stub 
      Intent intent = new Intent(getApplicationContext(), LeaderBoardActivity.class); 
      startActivity(intent); 
     } 

    }); 
} 

public static void setMultipleChoice() { 
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    listView.setOnItemLongClickListener(null); 
} 
} 

Logcat: Линия 154 является "qlualifierRoundListActivity.values.add (..." линия

03-20 23:05:59.272: E/AndroidRuntime(2392): FATAL EXCEPTION: main 
03-20 23:05:59.272: E/AndroidRuntime(2392): java.lang.NullPointerException 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at com.gstat.activities.SpectatorActivity.onItemSelected(SpectatorActivity.java:154) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:871) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at android.widget.AdapterView.access$200(AdapterView.java:42) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:837) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at android.os.Handler.handleCallback(Handler.java:587) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at android.os.Looper.loop(Looper.java:123) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-20 23:05:59.272: E/AndroidRuntime(2392):  at dalvik.system.NativeStart.main(Native Method) 

Вот и у меня qualifierRoundListActivity отображается на вкладке и ниже, как я начинаю его с. . мой главный класс

public void setupTab(final View view, final String tag) { 
    View tabView = createTabView(tabHost.getContext(), tag); 
    TabSpec setContent = tabHost.newTabSpec(tag).setIndicator(tabView); 
    Intent intent; 
    if(tag == "Practice Rounds") { 
     intent = new Intent(this, practiceRoundListActivity.class); 
     setContent.setContent(intent); 
    } 
    else { 
     intent = new Intent(this, qualifierRoundListActivity.class); 
     setContent.setContent(intent); 
    } 
    tabHost.addTab(setContent); 
} 

private static View createTabView(final Context context, final String text) { 
    View view = LayoutInflater.from(context).inflate(R.layout.tabs_small, null); 
    TextView textView = (TextView) view.findViewById(R.id.tabsText); 
    textView.setText(text); 
    return view; 
} 

Когда я добавил статический метод внутри квалификационном ... класс:

public static void add(String event) { 
    values.add(event); 
} 

Я получил исключение нулевого указателя в строке values.add (event).

+0

Можем ли мы увидеть, где вы инициализируете 'qualifierRoundListActivity.values'? Если это строка, то это выглядит так: «null» – codeMagic

ответ

0

Статические данные, которые инициализируются Activity, будут удалены, когда эта активность закончит свой жизненный цикл и будет собрана мусор. Вы не должны предполагать, что он будет там.

Вместо прямого доступа к данным, запросите его в статическом методе. Этот метод сначала проверяет, является ли статические данные нулевыми, и если да, то он будет повторно заполнять его, прежде чем возвращать его.

Жизненный цикл Android-активности запутан, и вы, вероятно, разработали некоторые разумные, но неверные предположения о том, как ведут себя действия.

Решение для вас, вероятно, должно состоять в том, чтобы сохранить эти данные (например, в SharedPreferences) и не беспокоить их сохранением как статическими данными, если это абсолютно необходимо.

+0

Выбранный метод также связан с жизненным циклом активности ... –

+0

Хорошо, я понимаю, что понимаю, что вы говорите, но я не уверен, где будет уничтожена деятельность. Я попробую SharedPreferences. –

+0

Подождите, почему это будет работать на практикеRoundListActivity, но не qualifierRoun ...? –

-1

Попробуйте поместить значения = new ArrayList(); перед setContentView

+0

Я не вижу, как это вообще поможет. –

Смежные вопросы