无法在aynctask中未调用Looper.prepare()异常的线程内创建处理程序

时间:2018-07-02 02:19:45

标签: java android asynchronous android-asynctask

我在以下代码中遇到此错误。我该如何解决 ?为什么会这样呢?我是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);
        }
    }
}

2 个答案:

答案 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);
            }
        });
    }
}
}