我从名为 Page Songe 的数据库中设置了一个歌曲列表,单击项目并开始另一个 Activity ,我使用 Intent.putExtra()
将 id 传递给下一个歌曲信息页面,然后歌曲信息页面得到ID,而不是调用 FindById
API 连接数据库以获取歌曲信息,我使用 Debug模式,它连接到数据库并获取正确的数据,但不知何故它只是没有显示在页面上,是不是setter/getter 问题?
代码:
public class SongPage extends Activity{
//textview
TextView ID;
TextView artist;
TextView year;
TextView weeks;
TextView songname;
SongInfoHolder SongHolder = new SongInfoHolder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.songpage);
//get the item id
Intent intent = this.getIntent();
String songID = intent.getStringExtra("itemid");
//connection to the api
new Connection().execute("http://192.168.1.105:3000/findById/" + songID);
SongInfoHolder SongHolder = new SongInfoHolder();
ID = (TextView)findViewById(R.id.textSongPage_ID);
artist = (TextView)findViewById(R.id.textSongPageArtist);
year = (TextView)findViewById(R.id.textSongPageYear);
weeks = (TextView)findViewById(R.id.textSongPageWeeks);
songname = (TextView)findViewById(R.id.textSongPageName);
//set text from getter
}
class Connection extends AsyncTask< String , String ,String> {
@Override
protected String doInBackground(String... params) {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
String finalJson = buffer.toString();
JSONObject finaObject = new JSONObject(finalJson);
//Put string into seter
SongInfoHolder SongHolder = new SongInfoHolder();
SongHolder.set_id(finaObject.getString("_id"));
SongHolder.setDecade(finaObject.getString("decade"));
SongHolder.setArtist(finaObject.getString("artist"));
SongHolder.setSong(finaObject.getString("song"));
SongHolder.setWeeksAtOne(finaObject.getString("weeksAtOne"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (JSONException e){
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if(result == null){
ID.setText(SongHolder.get_id());
artist.setText(SongHolder.getArtist());
year.setText(SongHolder.getDecade());
weeks.setText(SongHolder.getWeeksAtOne());
songname.setText(SongHolder.getSong());
}else {
}
}
}
}
setter/getter / setter/getter :
public class SongInfoHolder {
private String _id;
private String decade;
private String artist;
private String song;
private String weeksAtOne;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getDecade() {
return decade;
}
public void setDecade(String decade) {
this.decade = decade;
}
public String getSong() {
return song;
}
public void setSong(String song) {
this.song = song;
}
public String getWeeksAtOne() {
return weeksAtOne;
}
public void setWeeksAtOne(String weeksAtOne) {
this.weeksAtOne = weeksAtOne;
}
}
最佳答案
这不是 getter/setter 问题。问题是您正在调用 AsyncTask
,然后您立即尝试在 TextView
中设置值。到在那些 TextView
中设置文本的代码被命中时,SongHolder
中的数据还没有准备好(也因为您从未为此变量设置任何内容,您正在使用一个新的一个在 doInBackground
) 对象中。数据准备好后,您需要将文本设置为 TextView
。
在onPostExecute
方法中添加这些行
ID.setText(SongHolder.get_id());
artist.setText(SongHolder.getArtist());
year.setText(SongHolder.getDecade());
weeks.setText(SongHolder.getWeeksAtOne());
songname.setText(SongHolder.getSong());
同时在类级别定义这些 TextView
和 SongHolder
,以便它们可以在 onPostExcecute
方法中使用。并且不要在 doInBackground
中使用 SongInfoHolder
的新实例,使用您在类级别定义的实例。
关于java - 调用 API 成功但无法从 setter 和 getter 获取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35503703/