Java 使用OnItemClickListener冻结AsyncTask中的ProgressDialog指示器

Java 使用OnItemClickListener冻结AsyncTask中的ProgressDialog指示器,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我有以下代码,其中有关图像的信息从数据库加载并显示在自定义库视图中。问题是,我看不到将库的OnItemClickListener上的设置放在AsyncTask的后台线程中的方法,因为它是主UI线程的一部分(我想?)。当我加载活动时,对话框会弹出但会冻结,我想这是因为我在UI线程中设置了McClickListener,这需要很多工作。我怎样才能解决这个问题 private class loadTask extends AsyncTask<String, Integer, String>

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

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();
        }
     }
私有类loadTask扩展了AsyncTask{
ProgressDialog=新建ProgressDialog(ActivityGallery.this);
@凌驾
受保护的void onPreExecute(){
b=getIntent().getExtras();
setMessage(“加载…”);
dialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
v(“SC”,“ASYNC gethere!!”;
DBHandler=新的DBHandler(ActivityGallery.this);
SQLiteDatabase db=handler.getReadableDatabase();
游标c=db.rawQuery(“从图像中选择*”,null);
if(c.moveToFirst()){
做{
add(c.getString(1));
Log.v(“SC”,“游标:+c.getString(1));
}而(c.moveToNext());
} 
c、 close();
db.close();
handler.close();
返回null;
}
@凌驾
受保护的void onProgressUpdate(整数…s){
}
@凌驾
受保护的void onPostExecute(字符串结果){
Log.v(“SC”,“Final path:+path.toString());
setContentView(R.layout.gallery);
画廊=(画廊)findViewById(R.id.gallery1);
setAdapter(新的ImageAdapter(ActivityGallery.this));
gallery.setOnItemClickListener(新的OnItemClickListener(){
公共控件单击(AdapterView父对象、视图v、内部位置、,
长id){
所选图像位置=位置;
GoToShareActivity();
}
});     
dialog.dismise();
}
}

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

GoToShareActivity()做什么

如果这是另一个资源密集型操作,则会导致对话框冻结。这是因为它在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();
    }
}
@覆盖
创建时的公共void(Bundle savedInstanceState)
{
setContentView(R.layout.gallery);//放在loadTask()之前
.
.//您的其他实现
.
}
私有OnItemClickListener galleryOnItemClickListener=新建OnItemClickListener()
{
@凌驾
公共void onClick(视图v)
{
所选图像位置=位置;
GoToShareActivity();
}
};
私有类loadTask扩展了AsyncTask
{
.
.
.
受保护的void onPostExecute(字符串结果)
{
Log.v(“SC”,“Final path:+path.toString());
画廊=(画廊)findViewById(R.id.gallery1);
setAdapter(新的ImageAdapter(ActivityGallery.this));
画廊。setOnItemClickListener(galleryOnItemClickListener);
dialog.dismise();
}
}

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