Java doInBackground()String.length()空对象引用上的AsyncTask

Java doInBackground()String.length()空对象引用上的AsyncTask,java,android,json,android-asynctask,nullreferenceexception,Java,Android,Json,Android Asynctask,Nullreferenceexception,也许你能帮我。我的应用程序允许您将电影ID从API保存到SQLiteDatabase。我能够成功地检索电影ID和用户ID。当为电影发送API请求时,日志显示它也已成功返回,但我不断收到以下错误,应用程序重新启动或崩溃 05-19 18:43:10.118 8103-8103/? W/PathParser: Points are too far apart 4.000000596046461 05-19 18:43:15.263 2407-2626/? I/ActivityManager: S

也许你能帮我。我的应用程序允许您将电影ID从API保存到SQLiteDatabase。我能够成功地检索电影ID和用户ID。当为电影发送API请求时,日志显示它也已成功返回,但我不断收到以下错误,应用程序重新启动或崩溃

  05-19 18:43:10.118 8103-8103/? W/PathParser: Points are too far apart 4.000000596046461
05-19 18:43:15.263 2407-2626/? I/ActivityManager: START u0 {flg=0x10000 cmp=com.example.asc.app/.MovieList} from uid 10058 on display 0
05-19 18:43:15.283 8103-8103/? W/PathParser: Points are too far apart 4.000000596046461
05-19 18:43:15.293 8103-8103/? D/MovieList:: movie_user_id1
05-19 18:43:17.222 8103-8651/? W/System.err: java.io.FileNotFoundException: https://api.themoviedb.org/3/movie/278?api_key=b5c3cfd30f424540a36db95684a067e0
05-19 18:43:17.222 8103-8651/? W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
05-19 18:43:17.222 8103-8651/? W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
05-19 18:43:17.222 8103-8651/? W/System.err:     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)
05-19 18:43:17.222 8103-8651/? W/System.err:     at com.example.asc.app.MovieHttpClient.getMovieData(MovieHttpClient.java:43)
05-19 18:43:17.222 8103-8651/? W/System.err:     at com.example.asc.app.MovieAsyncTask.doInBackground(MovieAsyncTask.java:21)
05-19 18:43:17.222 8103-8651/? W/System.err:     at com.example.asc.app.MovieAsyncTask.doInBackground(MovieAsyncTask.java:13)
05-19 18:43:17.222 8103-8651/? W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
05-19 18:43:17.222 8103-8651/? W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-19 18:43:17.222 8103-8651/? W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
05-19 18:43:17.222 8103-8651/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
05-19 18:43:17.222 8103-8651/? W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
05-19 18:43:17.222 8103-8651/? W/System.err:     at java.lang.Thread.run(Thread.java:818)
05-19 18:43:17.223 8103-8103/? W/System.err: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
05-19 18:43:17.223 8103-8103/? W/System.err:     at java.util.concurrent.FutureTask.report(FutureTask.java:94)
05-19 18:43:17.223 8103-8103/? W/System.err:     at java.util.concurrent.FutureTask.get(FutureTask.java:164)
05-19 18:43:17.223 8103-8103/? W/System.err:     at android.os.AsyncTask.get(AsyncTask.java:498)
05-19 18:43:17.223 8103-8103/? W/System.err:     at com.example.asc.app.MovieList.populateList(MovieList.java:106)
05-19 18:43:17.223 8103-8651/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                                                 Process: com.example.asc.app, PID: 8103
                                                 java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                     at android.os.AsyncTask$3.done(AsyncTask.java:309)
                                                     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                     at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                     at java.lang.Thread.run(Thread.java:818)
                                                  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
                                                     at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
                                                     at org.json.JSONTokener.nextValue(JSONTokener.java:94)
                                                     at org.json.JSONObject.<init>(JSONObject.java:156)
                                                     at org.json.JSONObject.<init>(JSONObject.java:173)
                                                     at com.example.asc.app.JSONMovieParser.getMovie(JSONMovieParser.java:19)
                                                     at com.example.asc.app.MovieAsyncTask.doInBackground(MovieAsyncTask.java:26)
                                                     at com.example.asc.app.MovieAsyncTask.doInBackground(MovieAsyncTask.java:13)
                                                     at android.os.AsyncTask$2.call(AsyncTask.java:295)
                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                     at java.lang.Thread.run(Thread.java:818) 
编辑1:BTN搜索

 btnSearch.setOnClickListener(new android.view.View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            String searchString = txtSearch.getText().toString();
            TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
            TextView tvRating = (TextView) findViewById(R.id.tvRating);
            TextView tvReleaseDate = (TextView) findViewById(R.id.tvReleaseDate);
            TextView tvOverview = (TextView) findViewById(R.id.tvOverview);
            ImageView imgVPoster = (ImageView) findViewById(R.id.imgVPoster);
            boolean search = true;

            MovieAsyncTask task = new MovieAsyncTask();
            try {
                JSONObject object  = task.execute(searchString, search).get();
                //String title = "title";
                //String posterPath = "poster Path";
                String rating = "rating";
                String releaseDate = "release Date";
                String overview = "overview";

                final int numberOfItemsInResp = object.length();
                for(int i = 0; i < numberOfItemsInResp; i++)
                {
                    try{
                        title = object.get("title").toString();
                        movieID = (object.getInt("id"));
                        posterPath = object.get("poster_path").toString();
                        rating = object.get("vote_average").toString();
                        releaseDate = object.get("release_date").toString();
                        overview = object.get("overview").toString();
                    }
                    catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                String urlStr = BASE_URL + FILE_SIZE + posterPath;
                tvTitle.setText(title);
                tvRating.setText("Rating: " + rating + "/10");
                tvReleaseDate.setText("Released: " + releaseDate);
                tvOverview.setText("Plot \n" + overview);

                new SetPosterTask((ImageView) findViewById(R.id.imgVPoster))
                        .execute(urlStr);
                imgVPoster.setVisibility(View.VISIBLE);
                ibtnOff.setVisibility(View.VISIBLE);
                Log.d("MovieDetails", urlStr);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    });

你打过电话。马上开始这项任务。它将为空,因为它尚未对FutureTask做出响应。然后检查该空值的长度

JSONObject object  = task.execute(searchString, search).get();
...
final int numberOfItemsInResp = object.length();

您需要在另一个线程中的任务之后获得该任务的结果。AsyncTask为完成后将在UI线程中返回结果的内容提供帮助位。

执行后调用get的可能重复,这违背了AsyncTask的目的。在另一个活动中,我使用了相同的结构来获取对象。更新为btnSearch。您能否详细说明为什么它在这种情况下工作,或者是执行异步任务的正确方法?
public class MovieHttpClient {

private static final String API_KEY = "?api_key=b5c3cfd30f424540a36db95684a067e0";
private static final String BASE_URL = "https://api.themoviedb.org/3/";
private static final String SEARCH = "search/movie";
private static final String MOVIE = "movie/";
private static final String QUERY = "&query=";

public String getMovieData(String searchString, boolean search) {

    HttpURLConnection con = null ;
    InputStream is = null;
    String url;

    try {
        if (search) {
            url = BASE_URL + SEARCH + API_KEY + QUERY;
            url += searchString;
        }else{
            url = BASE_URL + MOVIE + searchString + API_KEY;
        }
        con = (HttpURLConnection) (new URL(url)).openConnection();
        con.setRequestMethod("GET");
        con.setDoInput(true);
        con.setDoOutput(true);
        con.connect();

        StringBuffer buffer = new StringBuffer();
        is = con.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = null;
        while ((line = br.readLine()) != null)
            buffer.append(line + "\r\n");

        is.close();
        con.disconnect();

        return buffer.toString();
    }
    catch(Throwable t) {
        t.printStackTrace();
    }
    finally {
        try { is.close(); } catch(Throwable t) {}
        try { con.disconnect(); } catch(Throwable t) {}
    }
    return null;
}
}
 btnSearch.setOnClickListener(new android.view.View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            String searchString = txtSearch.getText().toString();
            TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
            TextView tvRating = (TextView) findViewById(R.id.tvRating);
            TextView tvReleaseDate = (TextView) findViewById(R.id.tvReleaseDate);
            TextView tvOverview = (TextView) findViewById(R.id.tvOverview);
            ImageView imgVPoster = (ImageView) findViewById(R.id.imgVPoster);
            boolean search = true;

            MovieAsyncTask task = new MovieAsyncTask();
            try {
                JSONObject object  = task.execute(searchString, search).get();
                //String title = "title";
                //String posterPath = "poster Path";
                String rating = "rating";
                String releaseDate = "release Date";
                String overview = "overview";

                final int numberOfItemsInResp = object.length();
                for(int i = 0; i < numberOfItemsInResp; i++)
                {
                    try{
                        title = object.get("title").toString();
                        movieID = (object.getInt("id"));
                        posterPath = object.get("poster_path").toString();
                        rating = object.get("vote_average").toString();
                        releaseDate = object.get("release_date").toString();
                        overview = object.get("overview").toString();
                    }
                    catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                String urlStr = BASE_URL + FILE_SIZE + posterPath;
                tvTitle.setText(title);
                tvRating.setText("Rating: " + rating + "/10");
                tvReleaseDate.setText("Released: " + releaseDate);
                tvOverview.setText("Plot \n" + overview);

                new SetPosterTask((ImageView) findViewById(R.id.imgVPoster))
                        .execute(urlStr);
                imgVPoster.setVisibility(View.VISIBLE);
                ibtnOff.setVisibility(View.VISIBLE);
                Log.d("MovieDetails", urlStr);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    });
JSONObject object  = task.execute(searchString, search).get();
...
final int numberOfItemsInResp = object.length();