我有一个由一系列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
}
如果有人可以帮助我,我会很感激。谢谢!
答案 0 :(得分:1)
onResponse()
方法是稍后在网络请求返回值时调用的回调。服务器没有任何延迟响应。这意味着从onCreate调用的populateLessonDetails(..)
方法会触发网络请求,并立即返回到此函数的onCreate()
调用并前进。
你必须考虑到这一点。执行此操作的最佳方法是在onResponse内调用populateLessonTextViews()
方法。然后,您可以确保已加载内容。