android - 将 AsyncTask 与数据库一起使用

标签 android database multithreading android-asynctask

我有以下代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.screen_database); 
    db=new DBAdapter(this);         
    InitTask init_task=new InitTask();
    init_task.execute(db);
}

public class InitTask extends AsyncTask <DBAdapter, Void, List<GeoPoint>> {
    List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>();
    DBAdapter db;
    int latitude;
    int longitude;
    GeoPoint p;
    protected List<GeoPoint> doInBackground(DBAdapter...adapters) {
        try{
            db.openDataBase();
            Cursor c=db.getAllData();
            if (c.moveToFirst()) { 
                do{
                longitude=Integer.parseInt(c.getString(0));
                    latitude=Integer.parseInt(c.getString(1));
                    p = new GeoPoint(latitude,longitude);
                    geoPointsArray.add(p);
                } while(c.moveToNext());
            }
            c.close();
            db.close();
        } catch(Exception e) {
            Log.d("Eroare","doInBackground",e);
        }
        return geoPointsArray;
    }

    protected void onPostExecute(List<GeoPoint> geoPointsArray {
        super.onPostExecute(geoPointsArray);
        for (int i=0;i<geoPointsArray.size();i++) {
            Log.d("Lista",geoPointsArray.get(i).toString());
        }
    }
}

doInBackground 中,我尝试从数据库读取数据,在我的 onPostExecute() 中,我尝试显示数据,但我什么也没得到,我确信我在数据库中有一些东西。

最佳答案

因为我没有看到你对 AsyncTask Params,Progress,Result 的声明,这很难调试,但我可以看到两个问题 1) 你的 doInBackground 与原型(prototype) doInBackground(Params...) 不匹配 2) 当线程化的 doInBackground 在 onPostExecute 中返回时,我看不到实际对 geoPointsArray 做任何事情的代码。为了回答您的问题,您在 onPostExecute 回到了 GUI 线程。

我有一些代码 here ,这可能有帮助也可能没有帮助。

编辑:考虑将 db 作为参数传递

new AsynchTask<DataBase?,Void,List<GeoPoint>>

然后注释掉所有非数据库代码。 将数据库代码包装在 try catch Exception e 中。 在异常时写入 Log.d(TAG,"doInBackground",e)。 然后在 onPostExecute 中检查列表以查看 doInBackground 中的线程可能通过调用 Log.d(TAG,new Boolean(myList.isEmpty()).toString()) 返回什么

关于android - 将 AsyncTask 与数据库一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924270/

相关文章:

c - 向进程中的所有线程发送信号

c# - 线程池多客户端 TCP(消息处理)

Android - 按钮上的 9patch 填充

android - 如何在 Jetpack compose 中创建角度渐变?

android - 动态 Textview 滚动条不显示

mysql - 将 mysql 表与查询 UNION 或 JOIN 结合起来?

c++ - 为什么我的 4 线程实现不比单线程实现快?

android - logcat 显示过度延迟设置亮度

mysql - 为什么这个复杂的删除 SQL 查询不起作用?

sql - liquibase 使用 SQL 92 生成 SQL Diff 吗?