【问题标题】:Call API success but can't get string from setter and getter调用 API 成功但无法从 setter 和 getter 获取字符串
【发布时间】:2016-02-19 11:01:18
【问题描述】:

我从名为 Page Songe 的数据库中设置了一个歌曲列表,单击项目并开始另一个活动,我使用 Intent.putExtra() 将 ID 传递给下一个歌曲信息页面,歌曲信息页面获取 ID,然后调用 FindById API连接数据库以获取歌曲信息,我使用调试模式,它连接到数据库并获取正确的数据,但不知何故它只是没有显示在页面上,是 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 {
            }
        }
    }
}

获取器/设置器:

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;
    }
}

【问题讨论】:

  • 使用onPostExecute()方法设置数据。但要小心你造成的内存泄漏。

标签: java android


【解决方案1】:

这不是 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());

还要在类级别定义这些TextViewSongHolder,以便它们可以在onPostExcecute 方法中使用。并且不要在doInBackground 中使用SongInfoHolder 的新实例,使用您在类级别定义的实例。

【讨论】:

  • 对不起,我是编码新手,但类级别是什么意思?如果我 TextView ID = (TextView)findViewById(R.id.textSongPage_ID);在 onPostExecute 方法中,它不能使用 findviewbyid ,我应该在哪里定义这些变量?
  • 类级别意味着紧跟在public class SongPage extends Activity{之后
  • 我看到了,但是我改了'public class SongPage extends Activity{ //textview TextView ID = (TextView)findViewById(R.id.textSongPage_ID);' onPostExecute 方法找不到 ID 和 name...等
  • 不只是TextView ID; 并让ID = (TextView)findViewById(R.id.textSongPage_ID); 成为onCreate 的一部分。这适用于所有TextView。在类级别定义并在 onCreate 中初始化。
  • SongInfoHolder SongHolder = new SongInfoHolder(); 也是如此,并从 doInBackground 中删除此代码。
【解决方案2】:
    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;
    }


    }

然后在你的异步任务中添加这个

SongInfoHolder SongHolder = new SongInfoHolder(finaObject.getString("_id"),finaObject.getString("decade"),finaObject.getString("artist"),finaObject.getString("song"),finaObject.getString("weeksAtOne"));

并且您在太多地方初始化 SogInfoHolder 只是在设置数据时在本地初始化一次,在检索数据时初始化一次。从 oncreate() 和之前删除 SongInfoHolder。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多