Android的:在一个EditText插入空间导致系统崩溃 [英] Android: Inserting space in an edittext causes a crash

查看:339
本文介绍了Android的:在一个EditText插入空间导致系统崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的编辑文本作为一个搜索框,我从烂番茄API获取影片,用我的编辑文本中的文本,问题是。当一个空间插入应用程序崩溃,我假设我需要的空间为+的转换,但我不知道如何在哪里添加此code或究竟如何,我希望有人在这里将能够帮我。

这是我的code:

 私人TextView的搜索框;
    私人按钮BGO,bCancelAddFromWeb;
    私人的ListView moviesList;
    公众最终静态INT ACTIVITY_WEB_ADD = 3;    公开名单<串GT; movieTitles;
    公开名单<串GT; movieSynopsis;
    公开名单<串GT; movieImgUrl;
    私人ProgressDialog pDialog;    //烂番茄API密钥
    私有静态最后弦乐API_KEY =8q6wh77s65a54w433cab9rbsq;    //电影的数目,以显示
    私有静态最终诠释MOVIE_PAGE_LIMIT = 8;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.movi​​e_add_from_web);        InitializeVariables();    }    / *
     *初始化变量和创建从视图之间的桥梁
     * xml文件和这个类
     * /    私人无效InitializeVariables(){        搜索框=(EditText上)findViewById(R.id.etSearchBox);
        BGO =(按钮)findViewById(R.id.bGo);
        bCancelAddFromWeb =(按钮)findViewById(R.id.bCancelAddFromWeb);
        moviesList =(ListView控件)findViewById(R.id.list_movies);        bGo.setOnClickListener(本);
        bCancelAddFromWeb.setOnClickListener(本);
        moviesList.setOnItemClickListener(本);
    }    @覆盖
    公共无效的onClick(视图v){
        开关(v.getId()){        案例R.id.bGo:
            新RequestTask()
                    .execute(http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=
                            + API_KEY
                            +与& Q =
                            + searchBox.getText()
                            +与& page_limit =+ MOVIE_PAGE_LIMIT);
            打破;        案例R.id.bCancelAddFromWeb:
            完();
            打破;        }    }    私人无效refreshMoviesList(列表<串GT; movieTitles){
        moviesList.setAdapter(新ArrayAdapter<串GT;(这一点,
                android.R.layout.simple_list_item_1,movieTitles
                        .toArray(新的String [movieTitles.size())));
    }    私有类RequestTask扩展的AsyncTask<字符串,字符串,字符串> {        //使到指定URL的请求
        @覆盖
        保护字符串doInBackground(字符串... URI){
            HttpClient的HttpClient的=新DefaultHttpClient();
            HTT presponse响应;
            字符串responseString = NULL;
            尝试{
                //使HTTP请求
                响应= httpclient.execute(新HTTPGET(URI [0]));
                状态行状态行= response.getStatusLine();
                如果(statusLine.getStatus code()== HttpStatus.SC_OK){
                    ByteArrayOutputStream出=新ByteArrayOutputStream();
                    。response.getEntity()的writeTo(出);
                    out.close();
                    responseString = out.toString();
                }其他{
                    //关闭连接
                    。response.getEntity()的getContent()close()方法。
                    抛出新IOException异常(statusLine.getReasonPhrase());
                }
            }赶上(例外五){
                Log.d(测试,无法做一个成功的要求!);
            }
            返回responseString;
        }        //如果请求上述成功完成,这种方法会
        //自动运行,所以你可以做一些与响应        @覆盖
        在preExecute保护无效(){
            super.on preExecute();            pDialog =新ProgressDialog(MovieAddFromWeb.this);
            pDialog.setMessage(搜索...);
            pDialog.show();
        }        @覆盖
        保护无效onPostExecute(字符串响应){
            super.onPostExecute(响应);            尝试{
                //转换为一个JSON对象的字符串响应
                JSONObject的jsonResponse =新的JSONObject(响应);                //获取电影的阵列中的响应
                JSONArray jArray = jsonResponse.getJSONArray(电影);                //每个影片的标题添加到列表
                movieTitles =新的ArrayList<串GT;();                //新增
                movieSynopsis =新的ArrayList<串GT;();
                movieImgUrl =新的ArrayList<串GT;();                的for(int i = 0; I< jArray.length();我++){
                    的JSONObject电影= jArray.getJSONObject(ⅰ);
                    movieTitles.add(movie.getString(标题));                    movieSynopsis.add(movie.getString(大纲));
                    movieImgUrl.add(movie.getJSONObject(海报)。的getString(
                            配置文件));                }
                //刷新ListView控件
                refreshMoviesList(movieTitles);
            }赶上(JSONException E){
                Log.d(测试,无法成功解析JSON响应!);
            }
            pDialog.dismiss();
        }
    }    @覆盖
    公共无效onItemClick(适配器视图<> AV,观景,INT位置,长的id){        意图openMovieEditor =新意图(这一点,MovieEditor.class);
        openMovieEditor.putExtra(movieTitle,movieTitles.get(位置));        //新增
        openMovieEditor.putExtra(movieSynopsis,movieSynopsis.get(位置));
        openMovieEditor.putExtra(movieImgUrl,movieImgUrl.get(位置));        openMovieEditor.putExtra(callingActivity,ACTIVITY_WEB_ADD);
        startActivityForResult(openMovieEditor,ACTIVITY_WEB_ADD);    }
}

这是日志的错误:

  20 01-14:19:19.591:D /测试(907):不能做一个成功的要求!
01-14 20:19:19.690:D / AndroidRuntime(907):关闭VM
01-14 20:19:19.700:W / dalvikvm(907):主题ID = 1:螺纹未捕获的异常退出(组= 0x40a13300)
01-14 20:19:19.801:E / AndroidRuntime(907):致命异常:主要
01-14 20:19:19.801:E / AndroidRuntime(907):显示java.lang.NullPointerException
01-14 20:19:19.801:E / AndroidRuntime(907):在org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
01-14 20:19:19.801:E / AndroidRuntime(907):在org.json.JSONTokener.nextValue(JSONTokener.java:94)
01-14 20:19:19.801:E / AndroidRuntime(907):在org.json.JSONObject<&初始化GT;(JSONObject.java:154)
01-14 20:19:19.801:E / AndroidRuntime(907):在org.json.JSONObject<&初始化GT;(JSONObject.java:171)
01-14 20:19:19.801:E / AndroidRuntime(907):在il.jb.projectpart2.MovieAddFromWeb $ RequestTask.onPostExecute(MovieAddFromWeb.java:152)
01-14 20:19:19.801:E / AndroidRuntime(907):在il.jb.projectpart2.MovieAddFromWeb $ RequestTask.onPostExecute(MovieAddFromWeb.java:1)
01-14 20:19:19.801:E / AndroidRuntime(907):在android.os.AsyncTask.finish(AsyncTask.java:631)
01-14 20:19:19.801:E / AndroidRuntime(907):在android.os.AsyncTask.access $ 600(AsyncTask.java:177)
01-14 20:19:19.801:E / AndroidRuntime(907):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644)
01-14 20:19:19.801:E / AndroidRuntime(907):在android.os.Handler.dispatchMessage(Handler.java:99)
01-14 20:19:19.801:E / AndroidRuntime(907):在android.os.Looper.loop(Looper.java:137)
01-14 20:19:19.801:E / AndroidRuntime(907):在android.app.ActivityThread.main(ActivityThread.java:4745)
01-14 20:19:19.801:E / AndroidRuntime(907):在java.lang.reflect.Method.invokeNative(本机方法)
01-14 20:19:19.801:E / AndroidRuntime(907):在java.lang.reflect.Method.invoke(Method.java:511)
01-14 20:19:19.801:E / AndroidRuntime(907):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
01-14 20:19:19.801:E / AndroidRuntime(907):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-14 20:19:19.801:E / AndroidRuntime(907):在dalvik.system.NativeStart.main(本机方法)


解决方案

您应该按如下方式使用标准的URL编码:

 情况下R.id.bGo:
    新RequestTask()
            .execute(http://api.rottentomatoes.com/api/public/v1.0/movies.json?apikey=
                    + API_KEY
                    +与& Q =
                    + URLEn coder.en code(searchBox.getText(),UTF-8)
                    +与& page_limit =+ MOVIE_PAGE_LIMIT);

这将替换空格和所有其他非URL友好字符允许的字符(由RFC 1738和HTML规范所定义的)

My edit text serves as a search box, and I am getting movies from rotten tomatoes API, using the text inside my edit text, problem is. when a space is inserted the application crashes, I am assuming that I need to convert the spaces into +'s, but I have no clue how where to add this code or how exactly, I hope someone here will be able to help me.

this is my code:

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

    }
}

this is the log with the error:

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)

解决方案

You should use standard URL encoding as follows:

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

This will replace spaces and all other non-URL-friendly characters with allowed characters (as defined by RFC 1738 and the HTML spec)

这篇关于Android的:在一个EditText插入空间导致系统崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆