Java doInBackground()String.length()空对象引用上的AsyncTask
也许你能帮我。我的应用程序允许您将电影ID从API保存到SQLiteDatabase。我能够成功地检索电影ID和用户ID。当为电影发送API请求时,日志显示它也已成功返回,但我不断收到以下错误,应用程序重新启动或崩溃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
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();