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