【问题标题】:Freezing ProgressDialog indicator within AsyncTask with OnItemClickListener使用 OnItemClickListener 在 AsyncTask 中冻结 ProgressDialog 指示器
【发布时间】:2011-03-28 09:52:49
【问题描述】:

我有以下代码,其中有关图像的信息从数据库加载并显示在自定义图库视图中。问题是我看不到将设置放在 AsyncTask 的后台线程中画廊的 OnItemClickListener 上的方法,因为它是主 UI 线程的一部分(我认为?)。当我加载活动时,对话框弹出但冻结,我认为这是因为我在 UI 线程中设置 OnItemClickListener 需要大量工作。我该如何解决这个问题?

private class loadTask extends AsyncTask<String, Integer, String>{

        ProgressDialog dialog = new ProgressDialog(ActivityGallery.this);

        @Override 
        protected void onPreExecute(){
            b = getIntent().getExtras();

            dialog.setMessage("Loading..."); 
            dialog.show();
        }

        @Override
        protected String doInBackground(String... params) {


            Log.v("SC", "ASYNC GETS HERE!!");
            DBHandler handler = new DBHandler(ActivityGallery.this);
            SQLiteDatabase db = handler.getReadableDatabase();

            Cursor c = db.rawQuery("SELECT * FROM images", null);
            if (c.moveToFirst()) {
                do {
                    paths.add(c.getString(1));
                    Log.v("SC", "Cursor: " + c.getString(1)); 
                } while (c.moveToNext());
            } 

            c.close();
            db.close();
            handler.close();
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... s){

        }

        @Override
        protected void onPostExecute(String result){
            Log.v("SC", "Final Paths: " + paths.toString());

            setContentView(R.layout.gallery);

            gallery = (Gallery) findViewById(R.id.gallery1); 
            gallery.setAdapter(new ImageAdapter(ActivityGallery.this));
            gallery.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View v, int position,
                        long id) {
                    selected_image_position = position; 
                    GoToShareActivity();
                }
            });     
            dialog.dismiss();
        }
     }

【问题讨论】:

  • 你把这个 AsyncTask 保存在哪里?它在内部类中吗?
  • 是的,它在一个名为 ActivityGallery 的类中,而不是在它自己的类中。
  • 好的。做一件事.. 将 setONItemClickListener、setContentView、setAdapter 放在父类中...不要在 AsyncTask 中设置这一切。
  • 它们是在postExecute中设置的,所以与onCreate基本相同,这将如何解决问题?
  • 我之前也遇到过同样的问题..我通过将我告诉你的所有代码放入 onCreate() 中解决了它..

标签: java android multithreading android-asynctask


【解决方案1】:

我认为 GoToShareActivity() 会导致冻结。详细检查该功能。

【讨论】:

    【解决方案2】:

    GoToShareActivity() 有什么作用?

    如果这是另一个资源密集型操作,则会导致对话框冻结。这是因为onPostExecute() 在 UI 线程上运行。

    我有一个和你一样使用 asynctask 的类似程序。我尝试将我的 onItemClickListener() 放在 onPostExecute 中,但它不会冻结对话框,因为我没有在其中执行任何繁重的过程。 我了解您希望在对话框关闭后向用户显示图库的部分。

    回答:您可以在其中执行 gallery.setOnItemClickListener(),但是 onClick() 的实际执行不应该在其中。

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        setContentView(R.layout.gallery); //place before your loadTask()
        .
        . //your other implementations
        .
    }
    
    private OnItemClickListener galleryOnItemClickListener = new OnItemClickListener()
    {
        @Override
        public void onClick(View v)
        {
            selected_image_position = position; 
            GoToShareActivity();
        }
    };
    
    private class loadTask extends AsyncTask<String, Integer, String>
    {
        .
        .
        .
    
        protected void onPostExecute(String result)
        {
            Log.v("SC", "Final Paths: " +paths.toString());
    
            gallery = (Gallery)findViewById(R.id.gallery1);
            gallery.setAdapter(new ImageAdapter(ActivityGallery.this));
            gallery.setOnItemClickListener(galleryOnItemClickListener);
    
            dialog.dismiss();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多