我在以下代码中遇到此错误。我该如何解决 ?为什么会这样呢?我是android和java的新手。请解释。
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);
UpcomingMovies.this.runOnUiThread(new Runnable() {
public void run() {
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);
setUpcomingMovieList(movieDbs);
}
}
}
答案 0 :(得分:0)
似乎问题是试图直接在new AsyncTaskCLass().execute()
上运行execute方法,而没有引用该对象。
替换:
UpcomingMovies.this.runOnUiThread(new Runnable() {
public void run() {
new MovieInterface().execute() ;
}
});
通过:
MovieInterface movieInterface = new MovieInterface() ;
movieInterface.execute() ;
解决了。
答案 1 :(得分:0)
您只需要在onPostExecute中使用runOnUiThread,在其他线程中启动线程有时会导致此错误,如果必须以这种方式使用它,则必须释放循环程序,但在这种情况下,我认为我的方法要容易得多:>
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);
}
});
}
}
}