java Android - 如何从 URL/JSON 获取特定数据?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14210307/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 15:28:55  来源:igfitidea点击:

Android - How to get specific data from URL/JSON?

javaandroidjsonrotten-tomatoes

提问by user1924895

So I have this code, which is a page with a ListViewsearch field and a button to confirm the search, when the button is pressed the ListViewis filled with movie names from the Rotten Tomatoes API, The problem is that someone helped me with this code, and I would love some help breaking it down and understanding it sentence after sentence, My main goal is to get is to get the "title", "synopsis" and "url image" of a movie that was clicked in the list, and pass it with an intent to my other activity but the whole JSON and get specific data stuff, got me very confused.

所以我有这个代码,这是一个带有ListView搜索字段和确认搜索的按钮的页面,当按下按钮时,ListView会填充来自 Rotten Tomatoes API 的电影名称,问题是有人帮我写了这段代码,我希望得到一些帮助,将其分解并逐句理解,我的主要目标是获取在列表中单击的电影的“标题”、“概要”和“网址图像”,然后通过它意图用于我的其他活动,但整个 JSON 和获取特定数据的东西,让我非常困惑。

Link to Rotten Tomatoes API documentation, this is my code:

链接到烂番茄 API 文档,这是我的代码:

public class MovieAddFromWeb extends Activity implements View.OnClickListener,
        OnItemClickListener {

    private TextView searchBox;
    private Button bGo, bCancelAddFromWeb;
    private ListView moviesList;
    public List<String> movieTitles;
    static final int ACTIVITY_WEB_ADD = 3;

    // the Rotten Tomatoes API key
    private static final String API_KEY = "8q6wh77s65aw435cab9rbzsq";

    // the number of movies to show in the list
    private static final int MOVIE_PAGE_LIMIT = 8;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.movie_add_from_web);

        InitializeVariables();

    }

    /*
     * Initializing the variables and creating the bridge between the views from
     * the xml file and this class
     */

    private void InitializeVariables() {

        searchBox = (EditText) findViewById(R.id.etSearchBox);
        bGo = (Button) findViewById(R.id.bGo);
        bCancelAddFromWeb = (Button) findViewById(R.id.bCancelAddFromWeb);
        moviesList = (ListView) findViewById(R.id.list_movies);

        bGo.setOnClickListener(this);
        bCancelAddFromWeb.setOnClickListener(this);
        moviesList.setOnItemClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {

        case R.id.bGo:
            new RequestTask()
                    .execute("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey="
                            + API_KEY
                            + "&q="
                            + searchBox.getText()
                            + "&page_limit=" + MOVIE_PAGE_LIMIT);
            break;

        case R.id.bCancelAddFromWeb:
            finish();
            break;

        }

    }

    private void refreshMoviesList(List<String> movieTitles) {
        moviesList.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, movieTitles
                        .toArray(new String[movieTitles.size()])));
    }

    private class RequestTask extends AsyncTask<String, String, String> {
        // make a request to the specified url
        @Override
        protected String doInBackground(String... uri) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response;
            String responseString = null;
            try {
                // make a HTTP request
                response = httpclient.execute(new HttpGet(uri[0]));
                StatusLine statusLine = response.getStatusLine();
                if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    response.getEntity().writeTo(out);
                    out.close();
                    responseString = out.toString();
                } else {
                    // close connection
                    response.getEntity().getContent().close();
                    throw new IOException(statusLine.getReasonPhrase());
                }
            } catch (Exception e) {
                Log.d("Test", "Couldn't make a successful request!");
            }
            return responseString;
        }

        @Override
        protected void onPostExecute(String response) {
            super.onPostExecute(response);

            try {
                // convert the String response to a JSON object
                JSONObject jsonResponse = new JSONObject(response);

                // fetch the array of movies in the response
                JSONArray jArray = jsonResponse.getJSONArray("movies");

                // add each movie's title to a list
                movieTitles = new ArrayList<String>();
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject movie = jArray.getJSONObject(i);
                    movieTitles.add(movie.getString("title"));

                }
                // refresh the ListView
                refreshMoviesList(movieTitles);
            } catch (JSONException e) {
                Log.d("Test", "Couldn't successfully parse the JSON response!");
            }
        }
    }

    @Override
    public void onItemClick(AdapterView<?> av, View view, int position, long id) {

        Intent openMovieEditor = new Intent(this, MovieEditor.class);
        openMovieEditor.putExtra("movieTitle", movieTitles.get(position));
        openMovieEditor.putExtra("callingActivity", ACTIVITY_WEB_ADD);
        startActivityForResult(openMovieEditor, ACTIVITY_WEB_ADD);

    }
}

回答by Rajitha Siriwardena

see the modified code below..

请参阅下面的修改后的代码..

public class MovieAddFromWeb extends Activity implements View.OnClickListener, OnItemClickListener {

private TextView searchBox;
private Button bGo, bCancelAddFromWeb;
private ListView moviesList;
public List<String> movieTitles;

//added new variables
public List<String> movieSynopsis;
public List<String> movieImgUrl;


static final int ACTIVITY_WEB_ADD = 3;

// the Rotten Tomatoes API key
private static final String API_KEY = "8q6wh77s65aw435cab9rbzsq";

// the number of movies to show in the list
private static final int MOVIE_PAGE_LIMIT = 8;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.movie_add_from_web);

    InitializeVariables();

}

/*
 * Initializing the variables and creating the bridge between the views from
 * the xml file and this class
 */

private void InitializeVariables() {

    searchBox = (EditText) findViewById(R.id.etSearchBox);
    bGo = (Button) findViewById(R.id.bGo);
    bCancelAddFromWeb = (Button) findViewById(R.id.bCancelAddFromWeb);
    moviesList = (ListView) findViewById(R.id.list_movies);

    bGo.setOnClickListener(this);
    bCancelAddFromWeb.setOnClickListener(this);
    moviesList.setOnItemClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {

    case R.id.bGo:
        new RequestTask()
                .execute("http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey="
                        + API_KEY
                        + "&q="
                        + searchBox.getText()
                        + "&page_limit=" + MOVIE_PAGE_LIMIT);
        break;

    case R.id.bCancelAddFromWeb:
        finish();
        break;

    }

}

private void refreshMoviesList(List<String> movieTitles) {
    moviesList.setAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, movieTitles
                    .toArray(new String[movieTitles.size()])));
}

private class RequestTask extends AsyncTask<String, String, String> {
    // make a request to the specified url
    @Override
    protected String doInBackground(String... uri) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response;
        String responseString = null;
        try {
            // make a HTTP request
            response = httpclient.execute(new HttpGet(uri[0]));
            StatusLine statusLine = response.getStatusLine();
            if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                response.getEntity().writeTo(out);
                out.close();
                responseString = out.toString();
            } else {
                // close connection
                response.getEntity().getContent().close();
                throw new IOException(statusLine.getReasonPhrase());
            }
        } catch (Exception e) {
            Log.d("Test", "Couldn't make a successful request!");
        }
        return responseString;
    }

    @Override
    protected void onPostExecute(String response) {
        super.onPostExecute(response);

        try {
            // convert the String response to a JSON object
            JSONObject jsonResponse = new JSONObject(response);

            // fetch the array of movies in the response
            JSONArray jArray = jsonResponse.getJSONArray("movies");

            // add each movie's title to a list
            movieTitles = new ArrayList<String>();

            //newly added
            movieSynopsis = new ArrayList<String>();
            movieImgUrl= new ArrayList<String>();

            for (int i = 0; i < jArray.length(); i++) {
                JSONObject movie = jArray.getJSONObject(i);
                movieTitles.add(movie.getString("title"));


                movieSynopsis.add(movie.getString(#add the synopsis var name returned by the JSON));
                movieImgUrl.add(movie.getString(#add the urlvar name returned by the JSON));


            }
            // refresh the ListView
            refreshMoviesList(movieTitles);
        } catch (JSONException e) {
            Log.d("Test", "Couldn't successfully parse the JSON response!");
        }
    }
}

@Override
public void onItemClick(AdapterView<?> av, View view, int position, long id) {

    Intent openMovieEditor = new Intent(this, MovieEditor.class);
    openMovieEditor.putExtra("movieTitle", movieTitles.get(position));

    //newly added
    openMovieEditor.putExtra("movieSynopsis", movieSynopsis.get(position));
    openMovieEditor.putExtra("movieImgUrl", movieImgUrl.get(position));


    openMovieEditor.putExtra("callingActivity", ACTIVITY_WEB_ADD);
    startActivityForResult(openMovieEditor, ACTIVITY_WEB_ADD);

}