Android 即使对于一个小的JSON响应,也会出现内存不足错误
下面是从URL获取JSON响应的代码。我使用AsyncTask下载响应。从logcat输出中,错误显示在readFromStream方法中Android 即使对于一个小的JSON响应,也会出现内存不足错误,android,json,performance,out-of-memory,Android,Json,Performance,Out Of Memory,下面是从URL获取JSON响应的代码。我使用AsyncTask下载响应。从logcat输出中,错误显示在readFromStream方法中 private class MovieAsyncTask extends AsyncTask<String, Void, List<Movie>>{ @Override protected List<Movie> doInBackground(String... urls) { UR
private class MovieAsyncTask extends AsyncTask<String, Void, List<Movie>>{
@Override
protected List<Movie> doInBackground(String... urls) {
URL url = createUrl(urls[0]);
String jsonresponse = "";
try{
jsonresponse = makeHttpRequest(url);
}
catch (IOException e){
}
List<Movie> movieList = extractMovieFromJson(jsonresponse);
return movieList;
}
@Override
protected void onPostExecute(List<Movie> movieList) {
MovieAdapter adapter = new MovieAdapter(movieList);
recyclerView.setAdapter(adapter);
}
private URL createUrl(String stringUrl) {
URL url = null;
try {
url = new URL(stringUrl);
} catch (MalformedURLException e) {
return null;
}
return url;
}
private String makeHttpRequest(URL url) throws IOException{
String jsonresponse = null;
HttpURLConnection urlConnection = null;
InputStream inputStream = null;
try {
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setReadTimeout(10000);
urlConnection.setConnectTimeout(15000);
urlConnection.connect();
inputStream = urlConnection.getInputStream();
jsonresponse = readFromStream(inputStream);
}
catch (IOException e){
}
finally {
if(urlConnection != null)
urlConnection.disconnect();
if (inputStream != null)
inputStream.close();
}
return jsonresponse;
}
private String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if(inputStream != null){
InputStreamReader inputStreamReader = new InputStreamReader(inputStream , Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null){
output.append(line);
reader.readLine();
}
}
Log.v("response",output.toString());
return output.toString();
}
private List<Movie> extractMovieFromJson(String movieJson){
List<Movie> movieList = new ArrayList<>();
if (TextUtils.isEmpty(movieJson))
return null;
try{
JSONObject basejsonresponse = new JSONObject(movieJson);
JSONObject data = basejsonresponse.getJSONObject("data");
JSONArray movieArray = data.getJSONArray("movies");
for (int i = 0; i < movieArray.length(); i++) {
JSONObject movie = movieArray.getJSONObject(i);
String movieName = movie.getString("title_long");
String movieUrl = movie.getString("url");
String movieImg = movie.getString("background_image_original");
movieList.add(new Movie(movieName,movieUrl,movieImg));
}
return movieList;
}
catch (JSONException e){
}
return null;
}
}
}
我不明白为什么会这样。我看到一些帖子提到使用GSON。但我认为这不是一个很大的回应。请帮帮我。你有无限循环,因为你从不更新你的行变量。试试这个:
while (line != null) {
output.append(line);
line = reader.readLine();
}
while (line != null) {
output.append(line);
line = reader.readLine();
}