Java Can';t在aynctask中未调用Looper.prepare()异常的线程内创建处理程序
我得到以下代码的错误。我该如何解决这个问题?为什么会这样?我不熟悉android和java。请解释一下Java Can';t在aynctask中未调用Looper.prepare()异常的线程内创建处理程序,java,android,asynchronous,android-asynctask,Java,Android,Asynchronous,Android Asynctask,我得到以下代码的错误。我该如何解决这个问题?为什么会这样?我不熟悉android和java。请解释一下 public class UpcomingMovies extends Activity { ArrayList<String> moviesList = new ArrayList<String>(); ListView moviesListView ; @Override protected void onCreate(Bundl
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);
}
}
}
公共类UpcomingMovies扩展活动{
ArrayList moviesList=新的ArrayList();
ListView电影ListView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u即将上映的电影);
moviesListView=(ListView)findViewById(R.id.upcomingMoviesList);
UpcomingMovies.this.rununuithread(新的Runnable(){
公开募捐{
新建MovieInterface().execute();
}
});
}
公共无效设置ComingMovieList(MovieResultsPage upcomingMovies){
for(MovieDb结果:upcomingMovies.getResults()){
Log.d(“api”,result.getTitle().toString());
添加(result.getTitle().toString());
}
ArrayAdapter movieAdapter=新的ArrayAdapter(getApplicationContext(),android.R.layout.simple\u可选\u列表\u项,moviesList);
setAdapter(movieAdapter);
}
类MovieInterface扩展了异步任务
{
@凌驾
受保护的MovierSultsPage doInBackground(字符串…字符串){
TmdbMovies movies=newtmdbapi(“d2e5d02fe295efc00bad8da4dc384edf”).getMovies();
MovieResultsPage upcomingMovies=movies.getcoming(null,1,“IN”);
int totalpages=upcomingMovies.getTotalPages();
Log.d(“api”、“totalpages=“+Integer.toString(totalpages));
返回即将上映的电影;
}
@凌驾
后期执行时受保护的无效(MovierSultsPage movieDbs){
超级onPostExecute(movieDbs);
电影制作人;
}
}
}
问题似乎是试图在新AsyncTaskCLass().execute()上直接运行execute方法,而不引用对象
更换:
UpcomingMovies.this.runOnUiThread(new Runnable() {
public void run() {
new MovieInterface().execute() ;
}
});
MovieInterface movieInterface = new MovieInterface() ;
movieInterface.execute() ;
作者:
UpcomingMovies.this.runOnUiThread(new Runnable() {
public void run() {
new MovieInterface().execute() ;
}
});
MovieInterface movieInterface = new MovieInterface() ;
movieInterface.execute() ;
修复了它。您只需在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);
}
});
}
}
}
公共类UpcomingMovies扩展活动{
ArrayList moviesList=新的ArrayList();
ListView电影ListView;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u即将上映的电影);
moviesListView=(ListView)findViewById(R.id.upcomingMoviesList);
新建MovieInterface().execute();
}
公共无效设置ComingMovieList(MovieResultsPage upcomingMovies){
for(MovieDb结果:upcomingMovies.getResults()){
Log.d(“api”,result.getTitle().toString());
添加(result.getTitle().toString());
}
ArrayAdapter movieAdapter=新的ArrayAdapter(getApplicationContext(),android.R.layout.simple\u可选\u列表\u项,moviesList);
setAdapter(movieAdapter);
}
类MovieInterface扩展了异步任务
{
@凌驾
受保护的MovierSultsPage doInBackground(字符串…字符串){
TmdbMovies movies=newtmdbapi(“d2e5d02fe295efc00bad8da4dc384edf”).getMovies();
MovieResultsPage upcomingMovies=movies.getcoming(null,1,“IN”);
int totalpages=upcomingMovies.getTotalPages();
Log.d(“api”、“totalpages=“+Integer.toString(totalpages));
返回即将上映的电影;
}
@凌驾
后期执行时受保护的无效(MovierSultsPage movieDbs){
超级onPostExecute(movieDbs);
UpcomingMovies.this.rununuithread(新的Runnable(){
公开募捐{
电影制作人;
}
});
}
}
}