【问题标题】:Loading items in ListActivity blocks app在 ListActivity 块应用中加载项目
【发布时间】:2011-04-26 18:22:44
【问题描述】:

好吧,我正在制作一个应用程序,在该应用程序中,我使用 ListActivity 来显示包含我从 Internet 下载的图像以及 TextViews 和评分栏的视图。 我添加了一个 AsyncTask 来管理它,并将我的 setListAdapter 放在 onPostExecute() 部分;但是,我还希望在设置完成时显示一个进度条(或 progressdialog )。

该栏确实在我的模拟器中出现了一段时间,但是当我在设备上尝试我的应用程序时没有出现,甚至在模拟器中,当 setListAdapter 工作时,该栏会冻结,但是......只是我没有想出了如何在我的 ArrayAdapter 上添加 publishProgress,因为它是另一个类。 啊,是的,我为 ListActivity 设置了布局,这就是我放置进度条的位置,但我猜是设备使 doInBackground 部分非常快,因此布局甚至不显示。

这是我目前得到的:

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

            extras = getIntent().getExtras();
            platinumCinema = false;
            setContentView(R.layout.simple_list_item_1);

                Log.i(TAG,"Control B");  
                MoviesAsyncTask movieTask = new MoviesAsyncTask();
                movieTask.execute();
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title_billboard);
    }

@Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgress = (ProgressBar)findViewById(R.id.progressbar_Horizontal);          
        mProgress.setVisibility(View.VISIBLE);
        Log.i(TAG, "PreExecute");
         }

     @Override
            protected void onPostExecute(String result) {
                super.onPostExecute(result);
                if(result.equals("ok"))
                    Log.i(TAG,"Ended succesfully");
                //ProgressDialog mDialog = ProgressDialog.show(BillboardMovieList.this, "","Loading. Please wait...", true);

                publishProgress(75);

             if(searchMethod.equals("byCinema")){
                 setListAdapter(new ArrayAdapterSchemaCinemas(BillboardMovieList.this, listMovies,listPosters, listRating, listTimes));
             }else
...

【问题讨论】:

    标签: android progress-bar android-asynctask listactivity progressdialog


    【解决方案1】:

    不要从onPostExecute() 呼叫publishProgress()。对于初学者来说,直到onPostExecute() 完成之后,进度才会改变,因为onProgressUpdate() 需要在主应用程序线程上调用,而主线程正在运行你的onPostExecute() 逻辑。

    如果您仍然觉得运行速度太慢,我建议您使用 Traceview 或简单的日志记录语句来准确确定问题所在。

    【讨论】:

    • 到目前为止,问题在于设置 listAdapter,因为生成这是任务(如果我没记错的话)阻塞 UI 线程以生成列表本身。这必须在 onPostExecute 中完成,对吧?因为 doInBackground 不能处理这个,或者可以吗?
    • @Paulina D.:您可以在doInBackground() 中创建适配器,但在onPostExecute() 之前不能调用setListAdapter()
    • 那我怎样才能只创建适配器呢?在 ListView 文档中,我看不到 onCreateAdapter 或类似的东西 =(
    • @Paulina D.:AFAICT,您已经在创建适配器。我在您的代码中看到了new ArrayAdapterSchemaCinemas。给定类的名称并且它被传递给setListAdapter(),我猜它是一个适配器。
    • 嗯...好吧,实际上我只是移动了一段代码,我正在从网络中检索图像(我已将其编码到 ArrayAdapterSchema getView 中),这使得它变得非常慢。所以吸取了教训,任何“重”的东西都应该进入 doInBackground 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2023-04-02
    • 2016-03-05
    • 1970-01-01
    • 2018-11-26
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多