Android:ArrayList在第二次调用时获取nullpointer

时间:2015-02-08 10:24:38

标签: java android arraylist

所以我正在开发一个Android应用程序,目前有一些代码问题。它实际上很简单......我填写一个arraylist,也检查它是否被填充(它确实)然后再请求arraylist。但是不知怎的,当我稍后请求arraylist它是空的而我不是在做一个新的实例或任何东西......或者我只是简单地想念它。

所以这里的代码出错了......

package net.serellyn.c2m.cal2movement;

import android.app.Activity;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.Log;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends Activity implements TaskListener{

    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;
    private TaskListener listener;
    private Exercises exercises;

    //...

    private ArrayList<String> exerciseArrayList;

    //...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setLayout();

        sharedPreferences = getSharedPreferences("PreferenceValues", MODE_PRIVATE);
        editor = sharedPreferences.edit();

        listener = this;
        exercises = new Exercises();
        new sc_getExercises(listener).execute("http://www.serellyn.net/c2e/app_backend/exercises.php");

    }

    @Override
    public void taskComplete(ArrayList e) {
        exercises.setExercises(e);
        for(Exercise a : exercises.getExercises()) {
            Log.i("DebugInfo", a.getExercise());
        }
        setLayout();
    }

    private void setLayout() {
        Typeface tf_dinBlack = Typeface.createFromAsset(getAssets(), "DIN_Black.ttf");
        Typeface tf_dinMedium = Typeface.createFromAsset(getAssets(), "DIN_Medium.ttf");
        Typeface tf_dinLight = Typeface.createFromAsset(getAssets(), "DIN_Light.ttf");

        tv_appName = (TextView)findViewById(R.id.tv_appName);
        tv_appTagline = (TextView)findViewById(R.id.tv_appTagline);
        tv_hourNumber = (TextView)findViewById(R.id.tv_hoursNumber);
        tv_hourText = (TextView)findViewById(R.id.tv_hoursText);
        tv_minutesNumber = (TextView)findViewById(R.id.tv_minutesNumber);
        tv_minutesText = (TextView)findViewById(R.id.tv_minutesText);
        tv_yourActivity = (TextView)findViewById(R.id.tv_yourActivity);
        s_activities = (Spinner)findViewById(R.id.s_activities);

        tv_appName.setTypeface(tf_dinBlack);
        tv_appTagline.setTypeface(tf_dinMedium);
        tv_hourNumber.setTypeface(tf_dinLight);
        tv_hourText.setTypeface(tf_dinLight);
        tv_minutesNumber.setTypeface(tf_dinLight);
        tv_minutesText.setTypeface(tf_dinLight);
        tv_yourActivity.setTypeface(tf_dinLight);

        setActivityValues();
    }

    private void setActivityValues() {
        for(Exercise a : exercises.getExercises()) {
            Log.i("DebugInfo", a.getExercise());
        }
    }
}

sc_getExercises是一个AsyncTask,按预期工作,并在'TaskComplete'函数中填充'exercises'数组。我循环'exercise'array以查看它是否已填满,并且它应该被填充。

然而,当我稍后在'setActivityValues'中做同样的事情时,我会得到一个nullpointerexception。

所以这有点......我的眼中很奇怪。我做错了什么?

这是练习课。

package net.serellyn.c2m.cal2movement;

import java.util.ArrayList;

    public class Exercises {

        private ArrayList<Exercise> exercises;

        public Exercises(){
            exercises = new ArrayList<Exercise>();
        }

        public ArrayList<Exercise> getExercises() {
            return exercises;
        }
        public void setExercises(ArrayList<Exercise> exercises) {
            this.exercises = exercises;
        }    
    }

我希望有人能发现问题。提前谢谢。

2 个答案:

答案 0 :(得分:0)

这是你的方法:

private void setActivityValues() {
    for(Exercise a : exercises.getExercises()) {
        Log.i("DebugInfo", a.getExercise());
    }
}

exercisesnull(在onCreate中初始化),或者练习类实例中的exercises为空(在taskComplete获取值,调用setExercises),或循环中的一个练习是null,或者getExerciseNullPointerException错误。

答案 1 :(得分:-2)

它说nullPointerException,检查你的json解析器它是否正确填充你的列表。