Вам просто нужно использовать runOnUiThread в onPostExecute, запуск потока в другом потоке иногда вызывает эту ошибку, которая, если вы должны использовать ее таким образом, вы должны освободить петлитель, но в этом случае я думаю, что мой путь намного проще:
public class UpcomingMovies extends Activity {
ArrayList<String> moviesList = new ArrayList<String>();
ListView moviesListView ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_upcoming_movies);
moviesListView= (ListView) findViewById(R.id.upcomingMoviesList);
new MovieInterface().execute() ;
}
public void setUpcomingMovieList(MovieResultsPage upcomingMovies) {
for (MovieDb result : upcomingMovies.getResults()) {
Log.d("api", result.getTitle().toString());
moviesList.add(result.getTitle().toString());
}
ArrayAdapter movieAdapter = new ArrayAdapter(getApplicationContext() , android.R.layout.simple_selectable_list_item , moviesList) ;
moviesListView.setAdapter(movieAdapter);
}
class MovieInterface extends AsyncTask<String , Void , MovieResultsPage>
{
@Override
protected MovieResultsPage doInBackground(String... strings) {
TmdbMovies movies = new TmdbApi("d2e5d02fe295efc00bad8da4dc384edf").getMovies();
MovieResultsPage upcomingMovies = movies.getUpcoming(null, 1, "IN");
int totalpages = upcomingMovies.getTotalPages();
Log.d("api" , "totalpages = " + Integer.toString(totalpages)) ;
return upcomingMovies;
}
@Override
protected void onPostExecute(MovieResultsPage movieDbs) {
super.onPostExecute(movieDbs);
UpcomingMovies.this.runOnUiThread(new Runnable() {
public void run() {
setUpcomingMovieList(movieDbs);
}
});
}
}
}