java - 调用 API 成功但无法从 setter 和 getter 获取字符串

标签 java android

我从名为 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());

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

关于java - 调用 API 成功但无法从 setter 和 getter 获取字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35503703/

相关文章:

android - 当设备处于 sleep 状态时对敲击电话执行操作?

java - 从 JVM 崩溃中恢复

java - 在struts2中,如何使用注释来验证模型驱动的操作?

java - 在 JMenu 中居中文本

java - 在上传多个 apk 的情况下从 Google PlayStore 获取最新的应用程序版本

android - Kotlin with Room and Dagger - 编译错误

java - 比较器以错误的顺序给出数据

java - JSP JSTL <c :if ="${1 == 2}"> returning true

android - 如何将自定义按钮添加到 AlertDialog 布局中?

android - 如何在android中将标签文本居中对齐