0

私の編集テキストは検索ボックスとして機能し、編集テキスト内のテキストを使用して、腐ったトマト API から映画を取得しています。問題は. スペースを挿入するとアプリケーションがクラッシュします。スペースを + に変換する必要があると思いますが、このコードをどこに追加するのか、正確にどのように追加するのかわかりません。ここの誰かが私を助けてくれることを願っています。

これは私のコードです:

    private TextView searchBox;
    private Button bGo, bCancelAddFromWeb;
    private ListView moviesList;
    public final static int ACTIVITY_WEB_ADD = 3;

    public List<String> movieTitles;
    public List<String> movieSynopsis;
    public List<String> movieImgUrl;
    private ProgressDialog pDialog;

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

    // the number of movies to show
    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;
        }

        // if the request above completed successfully, this method will
        // automatically run so you can do something with the response

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            pDialog = new ProgressDialog(MovieAddFromWeb.this);
            pDialog.setMessage("Searching...");
            pDialog.show();
        }

        @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("synopsis"));
                    movieImgUrl.add(movie.getJSONObject("posters").getString(
                            "profile"));

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

    @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);

    }
}

これはエラーのあるログです:

01-14 20:19:19.591: D/Test(907): Couldn't make a successful request!
01-14 20:19:19.690: D/AndroidRuntime(907): Shutting down VM
01-14 20:19:19.700: W/dalvikvm(907): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
01-14 20:19:19.801: E/AndroidRuntime(907): FATAL EXCEPTION: main
01-14 20:19:19.801: E/AndroidRuntime(907): java.lang.NullPointerException
01-14 20:19:19.801: E/AndroidRuntime(907):  at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
01-14 20:19:19.801: E/AndroidRuntime(907):  at org.json.JSONTokener.nextValue(JSONTokener.java:94)
01-14 20:19:19.801: E/AndroidRuntime(907):  at org.json.JSONObject.<init>(JSONObject.java:154)
01-14 20:19:19.801: E/AndroidRuntime(907):  at org.json.JSONObject.<init>(JSONObject.java:171)
01-14 20:19:19.801: E/AndroidRuntime(907):  at il.jb.projectpart2.MovieAddFromWeb$RequestTask.onPostExecute(MovieAddFromWeb.java:152)
01-14 20:19:19.801: E/AndroidRuntime(907):  at il.jb.projectpart2.MovieAddFromWeb$RequestTask.onPostExecute(MovieAddFromWeb.java:1)
01-14 20:19:19.801: E/AndroidRuntime(907):  at android.os.AsyncTask.finish(AsyncTask.java:631)
01-14 20:19:19.801: E/AndroidRuntime(907):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-14 20:19:19.801: E/AndroidRuntime(907):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-14 20:19:19.801: E/AndroidRuntime(907):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 20:19:19.801: E/AndroidRuntime(907):  at android.os.Looper.loop(Looper.java:137)
01-14 20:19:19.801: E/AndroidRuntime(907):  at android.app.ActivityThread.main(ActivityThread.java:4745)
01-14 20:19:19.801: E/AndroidRuntime(907):  at java.lang.reflect.Method.invokeNative(Native Method)
01-14 20:19:19.801: E/AndroidRuntime(907):  at java.lang.reflect.Method.invoke(Method.java:511)
01-14 20:19:19.801: E/AndroidRuntime(907):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-14 20:19:19.801: E/AndroidRuntime(907):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-14 20:19:19.801: E/AndroidRuntime(907):  at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

2

次のように、標準の URL エンコーディングを使用する必要があります。

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

これにより、スペースやその他の URL に適していないすべての文字が、許可されている文字 (RFC 1738 および HTML 仕様で定義されている) に置き換えられます。

于 2013-01-14T20:21:03.050 に答える
0

それが実際の問題であることを確認するためにlogcatを確認する必要がありますが、コードからは、それが少なくとも1つの問題であるように見えます。

理想的にはあなたは次のようなことをするでしょう

String search = searchBox.getText();
search = search.replace(" ", "+");

次に、その変数を使用してRequestTask

出典:Androidデベロッパー

逆に、スペースを置き換えるだけでなく、返された文字列に対して完全なエンコードを行う方がよい場合があります...他の文字でも問題が発生するため(?、&など)

編集:URLEncodingバージョンについてはEJKの回答を参照してください。

于 2013-01-14T20:19:32.663 に答える