调用API成功,但无法从setter和getter

时间:2016-02-19 11:01:18

标签: java android

我从名为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 {
            }
        }
    }
}

2 个答案:

答案 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。