我从名为Page Songe的数据库中设置一个歌曲列表,点击项目并开始另一个活动,我使用Intent.putExtra()
将id传递给下一个歌曲信息页面,而歌曲信息页面获取ID,而不是呼叫{{ 1}}用于连接数据库以获取歌曲信息的API,我使用调试模式,它连接到数据库并获取正确的数据,但不知何故它只是没有在页面上显示,是否是一个setter / getter问题?< / p>
代码:
FindById
吸气/设定器:
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 {
}
}
}
}
答案 0 :(得分:1)
它不是一个getter / setter问题。问题是您正在调用AsyncTask
,之后您尝试在TextView
中设置值。当设置TextView
中的文本的时间代码被命中时,SongHolder
中的数据尚未就绪(也是因为您从未对此变量设置任何内容,您在{{1}中使用了新数据})对象。当数据准备就绪时,您需要将文本设置为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
中使用SongInfoHolder
的新实例,请使用您在班级定义的实例。
答案 1 :(得分:0)
'use strict';
class Base {
constructor() {
this.val = 10;
init();
}
init() {
console.log('this.val = ' + this.val);
}
};
class Derived extends Base {
constructor() {
super();
}
};
var d = new Derived();
然后在你的asynctask中添加这个
public class SongInfoHolder {
private String _id;
private String decade;
private String artist;
private String song;
private String weeksAtOne;
//add your constructor here .
public SongInfoHolder(String _id,String decade,String artist,String song,String weeksAtOne {
this._id=id;
this.decade=decade;
this.artist=artist;
this.song=song;
this.weeksAtOne=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;
}
}
并且您正在太多地方初始化SogInfoHolder,只需在设置数据时在本地初始化一次,并在重新搜索数据时进行一次初始化。从oncreate()之前和之前删除SongInfoHolder。