Не удалось создать обработчик внутри потока, который не вызвал исключение Looper.prepare () в aynctask - PullRequest
0 голосов
/ 02 июля 2018

Я получаю эту ошибку для приведенного ниже кода. Как это исправить ? почему это счастье? Я новичок в 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 голосов
/ 02 июля 2018

Вам просто нужно использовать 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);
            }
        });
    }
}
}
0 голосов
/ 02 июля 2018

Кажется, проблема заключалась в попытке запустить метод execute на new AsyncTaskCLass().execute() напрямую без ссылки на объект.

Замена:

UpcomingMovies.this.runOnUiThread(new Runnable() {
            public void run() {
                new MovieInterface().execute() ;
            }
        });

По:

   MovieInterface movieInterface = new MovieInterface() ;
   movieInterface.execute() ;

Исправлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...