Android Volley请求 - 请求填充自定义类无法正常工作

时间:2016-01-10 01:51:44

标签: java android android-volley

我有一个由一系列TextViews(十四个)和两个按钮组成的Activity。 我创建了一个名为Lesson的自定义类,它的变量基本上有一个构造函数和getter方法。 现在,在我的onCreate()我的活动中,我正在调用两个函数:1。)populateLessonDetails(myURL)和2.)populateLessonTextViews()

我在我的Activity中创建了一个private Lesson mLesson;变量,而不是@Overrides,因为我正在尝试使用此变量来填充它。

因此,populateLessonDetails(myURL)基本上是JsonArrayRequest,从onResponse()中获取JSON中的所有数据,并将其保存到String变量内onResponse()然后,仍然在onResponse()内部我试图填充mLesson变量,通过调用 mLesson = new Lesson(mName, mRoom, mExtra, mAddress, mPC, mCity, mStart, mDate, mRID, mMaxAtt, mCurrentAtt); - 构造函数中使用的变量是包含JSON数据的String变量。

通过其getter方法我Log.i() JSON数据以及mLesson变量,数据就在那里。一切都很好。

现在,我的populateLessonDetails()结束了。 它返回onCreate()并继续下一行代码,它将调用populateLessonTextViews()。 这是事情向南发展的地方...... 一旦调用该函数,我尝试通过其getter方法将{(1}}中存储的信息设置为mLesson,如下所示:

TextViews

这是正确的方法,我已经完成了很多次,但是我的应用程序在第二行崩溃了。

我已调试它,我注意到 //Lesson Name Big TextView lessonNameTextBig = (TextView) findViewById(R.id.text_activelesson_name_big); lessonNameTextBig.setText(mLesson.getLessonName()); 为空。我的猜测是我在mLesson的{​​{1}}内填充onResponse()JsonArrayRequest内的populateLessonDetails()仅对此特定函数有效,变量范围mLesson当函数返回onCreate()并且mLesson变量因为函数死亡而再次为空时结束。

现在我该如何解决这个问题?我是否必须将mLesson设置为populateLessonDetails()的参数,然后还将其返回(目前填充函数为void)?然后将返回值保存到Lesson类型的另一个变量中,并将此新变量设置为populateLessonTextViews()的参数?我尝试过这些东西,但是它们没有用,但也许只是我做得不对。

这就是我的代码(重要部分):

public class ActiveLesson extends AppCompatActivity {
// there are also some other variables up here 
private Lesson mLesson;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_active_lesson);
    requestQ = Volley.newRequestQueue(this);
    Intent intent = getIntent();
    Bundle extras = intent.getExtras();
    mDatum = extras.getString("datum");
    mRID = extras.getString("rid");
    mVon = extras.getString("von");

    myActiveLessonURLFiltered += "datum="+mDatum+"&rid="+mRID+"&von="+mVon;

    populateLessonDetails(myActiveLessonURLFiltered);
    populateLessonTextViews();

}

private void populateLessonDetails(String myActiveLessonURLFiltered) {

    JsonArrayRequest lessonJAR = new JsonArrayRequest(myActiveLessonURLFiltered, 
        new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response){
            try{
                for (int i=0; i < response.length(); i++)
                {
                    JSONObject jsonObject = response.getJSONObject(i);
                    String mName = jsonObject.getString("Name");
                    String mRoom = jsonObject.getString("Raum");
                    String mExtra = jsonObject.getString("Zusatz");
                    String mAdresse = jsonObject.getString("Address");
                    String mPC = jsonObject.getString("PLZ");
                    String mCity = jsonObject.getString("City");
                    String mMaxAtt = jsonObject.getString("maxAnz");
                    String mCurrentAtt = jsonObject.getString("belegtAnz");

                    if(mExtra.length()==0 || mExtra == "null")
                        mExtra="";
                    if(mRoom.length()==0 || mRoom == "null")
                        mRoom="";
                    else
                        mRoom="Room: "+mRoom;

                    if(mName.length()==0 || mName == "null")
                        mName="";

                    mLesson = new Lesson(mName, mRoom, mExtra, mAdresse, 
                  mPC, mCity, mVon, mDatum, mRID, mMaxAtt, mCurrentAtt);

                    Log.i("mmLesson"," Lesson with new =  "+ mLesson.getLessonName() 
              +" "+mLesson.getLessonCity());

                }
            }catch (JSONException e){
                e.printStackTrace();
            }

        }
    },
            new Response.ErrorListener(){
                @Override
                public void onErrorResponse(VolleyError error){
                    error.printStackTrace();
                    Toast.makeText(ActiveLesson.this, "No Lessons Available", 
                     Toast.LENGTH_LONG).show();
                }
            }){

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Accept", "application/json");
            return headers;
        }

    };
    requestQ.add(lessonJAR);
}

private void populateLessonTextViews(Lesson mLesson) {

    //Lesson Name Big
    TextView lessonNameTextBig = (TextView) findViewById(R.id.text_activelesson_name_big);
    lessonNameTextBig.setText(mLesson.getLessonName());

    // there are others lines of code like these two, 
    //  but I've left them out, since they are all the same
}

如果有人可以帮助我,我会很感激。谢谢!

1 个答案:

答案 0 :(得分:1)

onResponse()方法是稍后在网络请求返回值时调用的回调。服务器没有任何延迟响应。这意味着从onCreate调用的populateLessonDetails(..)方法会触发网络请求,并立即返回到此函数的onCreate()调用并前进。 你必须考虑到这一点。执行此操作的最佳方法是在onResponse内调用populateLessonTextViews()方法。然后,您可以确保已加载内容。