2016-02-21 2 views
0

Ладно, до сих пор мой MainActivity для этого простого приложения выглядит следующим образом:Android приложение не работает должным образом с первой попытки

public class MainActivity extends AppCompatActivity { 

ListView moviesListView; 
ArrayList <Movie> moviesList; 
MoviesAdapter moviesAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    moviesListView = (ListView) findViewById(R.id.moviesListView); 
    moviesList = new ArrayList<Movie>(); 

    runProgram(); 
    moviesAdapter = new MoviesAdapter(getApplicationContext(), R.layout.movies_layout, moviesList); 
    moviesListView.setAdapter(moviesAdapter); 
} 

private void runProgram() { 

    String url = "https://api.themoviedb.org/3/" + 
      "discover/movie?primary_release_date.gte=2016-02-01&primary_release_date.lte=2016-02-18" + 
      "&api_key=..............................."; 

    JsonObjectRequest jsObjRequest = new JsonObjectRequest 
      (Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        getMovies(response); 
       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 
        // TODO Auto-generated method stub 

       } 
      }); 

    // Access the RequestQueue through your singleton class. 
    MySingleton.getInstance(this).addToRequestQueue(jsObjRequest); 
} 


private void getMovies(JSONObject response) { 
    JSONArray jsonArray = null; 
    String imageBaseURL = "http://image.tmdb.org/t/p/w500"; 
    try { 
     jsonArray = response.getJSONArray("results"); 
     for (int i = 0; i < 5; i++){ 
      Movie movie = new Movie(jsonArray.getJSONObject(i).getString("title"), 
        jsonArray.getJSONObject(i).getString("overview"), 
        imageBaseURL + jsonArray.getJSONObject(i).getString("poster_path") 
        + "?&api_key=6b54bd769063ac68b99fac57aa334eae"); 
      moviesList.add(movie); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

}

То, что я пытаюсь сделать здесь запрос фильмы от TMDB и отобразить их в ListView. Но моя проблема в том, что при первом запуске приложения он ничего не отображает, вы увидите только белый экран. Теперь, если вы попытаетесь запустить его снова, он отобразит фильмы в ListView. Но если вы очистите кеш приложения и попробуйте запустить его еще раз, вы снова увидите белый экран .... Я действительно смущен тем, что здесь происходит. Я пробовал отлаживать его, и кажется, что он быстро получает данные, поэтому все, что происходит, происходит после этого.

Кроме того, здесь есть код моего адаптера в случае:

public class MoviesAdapter extends ArrayAdapter<Movie> { 

    ArrayList<Movie> moviesList; 
    int adapterResource; 
    Context adapterContext; 
    LayoutInflater layoutInflator; 

    public MoviesAdapter(Context context, int resource, ArrayList<Movie> objects) { 
     super(context, resource, objects); 

     moviesList = objects; 
     adapterResource = resource; 
     adapterContext = context; 
     layoutInflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     final ViewHolder viewHolder; 
     if (convertView == null){ 
      convertView = layoutInflator.inflate(adapterResource, null); 
      viewHolder = new ViewHolder(); 

      viewHolder.movieImage = (ImageView) convertView.findViewById(R.id.movieImage); 
      viewHolder.movieName = (TextView) convertView.findViewById(R.id.movieName); 
      viewHolder.movieOverview = (TextView) convertView.findViewById(R.id.movieOverview); 

      convertView.setTag(viewHolder); 
     } 
     else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     new DownloadImageTask(viewHolder.movieImage).execute(moviesList.get(position).getImageURL()); 
     viewHolder.movieName.setText(moviesList.get(position).getName()); 
     viewHolder.movieOverview.setText(moviesList.get(position).getOverview()); 
     return convertView; 
    } 


    public static class ViewHolder{ 
     public ImageView movieImage; 
     public TextView movieName; 
     public TextView movieOverview; 
    } 

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 
      try { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception ex) { 
       Log.e("Error", ex.getMessage()); 
       ex.printStackTrace(); 
      } 
      return mIcon11; 
     } 

     protected void onPostExecute(Bitmap result) { 
      bmImage.setImageBitmap(result); 
     } 

    } 

} 

Любая помощь будет оценена.

ответ

1

Каждый раз, когда вы вызываете getView(), вы должны начать новый DownloadTask. Это просто неправильно, так как то же изображение может уже быть загружено/в процессе загрузки

Использование универсального изображения погрузчиком или Пикассо:

Вместо этого:

new DownloadImageTask(viewHolder.movieImage).execute(moviesList.get(position).getImageURL()); 

Использование:

Picasso.with(context) 
    .load(moviesList.get(position).getImageURL()) 
    .into(viewHolder.movieImage); 

Кроме того, кажется, что ваша функция getMovies() выполнена в основном потоке. Так как вы разбора JSON здесь, переместить его в фоновый поток с помощью AsyncTask

В-третьих, после того, как вы getMovies(response);, вам нужно позвонить notifyDataSetChange() на вашем moviesAdapter

+0

Где следует, что код идти именно? и вместо чего? Спасибо, я попробую, как только вы дадите мне знать. –

+0

@ billy_b29 см. Редактировать –

+0

Awesome! Он работал, добавляя библиотеку Picasso и moviesAdapter.notifyDataSetChange(). Теперь я сделаю некоторое чтение о многопоточности, чтобы добавить его. Спасибо вам за помощь! Я сразу узнал три новые вещи. –

Смежные вопросы