【问题标题】:Can't create handler inside thread that has not called Looper.prepare() Exception in aynctask无法在 aynctask 中未调用 Looper.prepare() 异常的线程内创建处理程序
【发布时间】:2018-12-10 05:21:44
【问题描述】:

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

【问题讨论】:

    标签: java android asynchronous android-asynctask


    【解决方案1】:

    似乎问题是试图在不引用对象的情况下直接在new AsyncTaskCLass().execute() 上运行执行方法。

    更换:

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

    作者:

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

    修复它。

    【讨论】:

      【解决方案2】:

      您只需要在 onPostExecute 中使用 runOnUiThread,在其他线程中启动一个线程有时会导致此错误,如果您必须以这种方式使用它,您必须释放 looper,但在这种情况下,我认为我的方式要容易得多:

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

      【讨论】:

        猜你喜欢
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 2011-09-06
        • 1970-01-01
        相关资源
        最近更新 更多