【发布时间】: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