【问题标题】:Having problems trying to set an adapter inside an AsyncTask尝试在 AsyncTask 中设置适配器时遇到问题
【发布时间】:2011-08-08 21:09:38
【问题描述】:

当一项活动开始时,我需要从一个数据库中检索一些庞大的数据。为了防止用户冻结窗口,我决定在处理数据时运行 ProgressDialog。

从 OnCreate 我调用我的 initDb 类:

新的 initDb().execute();

然后为了做到这一点,我在我的活动类中有一个类:

public class initDb extends AsyncTask<Void, Void, Void> {

    ProgressDialog mDialog = new ProgressDialog(ClientsReg.this);

    @Override
    protected void onPreExecute() {
        mDialog.setMessage("Please wait...");
        mDialog.show();
    }


    @Override
    protected Void doInBackground(Void... voids) {

        opendb();
        listCities();
    return null;


    }

@Override
    protected void onPostExecute(Void unused) {
        // Pass the result data back to the main activity
        mDialog.dismiss();
    }

}

真正的问题发生在设置适配器时:

private void listCities() {


      mRedrawHandler.sleep(100000);


        c = db.executeSQL("SELECT * FROM RegDB WHERE Reg_Type = 1 AND cad_uzkow = 0 ORDER BY _id DESC");

        //add some list items
        ArrayList<String> finalList = new ArrayList<String>();

        c.moveToFirst();


        while (!c.isAfterLast()){

            finalList.add(c.getString(0) + ")"+ c.getString(5));            
            c.moveToNext();
        }


        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                R.layout.row, R.id.itemShow, finalList);
        sp.setAdapter(adapter);


    }

在 sp.setAdapter(adapter); 上总是发生崩溃;

有什么想法吗?

谢谢!

【问题讨论】:

  • 你能从 logcat 发布崩溃日志吗?

标签: android arraylist android-asynctask android-arrayadapter


【解决方案1】:

尝试将 finalList 作为 initDb 类的属性,这样您可以在 doInBackground 方法中填充它,然后在 onPostExecute 中使用它,如下所示:

    public class initDb extends AsyncTask<Void, Void, Void> {

    ProgressDialog mDialog = new ProgressDialog(ClientsReg.this);
    ArrayList<String> finalList;

    @Override
    protected void onPreExecute() {
        mDialog.setMessage("Please wait...");
        mDialog.show();
    }


    @Override
    protected Void doInBackground(Void... voids) {

        opendb();
        listCities();
    return null;


    }

@Override
    protected void onPostExecute(Void unused) {
        // Pass the result data back to the main activity

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                R.layout.row, R.id.itemShow, finalList);
        sp.setAdapter(adapter);

        mDialog.dismiss();
    }

private void listCities() {


      mRedrawHandler.sleep(100000);


        c = db.executeSQL("SELECT * FROM RegDB WHERE Reg_Type = 1 AND cad_uzkow = 0 ORDER BY _id DESC");

        //add some list items
        finalList = new ArrayList<String>();

        c.moveToFirst();


        while (!c.isAfterLast()){

            finalList.add(c.getString(0) + ")"+ c.getString(5));            
            c.moveToNext();
        }
}

【讨论】:

    【解决方案2】:

    你应该打电话:

    sp.setAdapter(adapter);
    

    在主 UI 线程中。例如在onPostExecute() 函数中。始终牢记视图(例如ListView)只能从主线程访问。

    【讨论】:

      【解决方案3】:

      除了创建 UI 的线程之外,您无法从其他线程访问 UI。所以在 AsyncTask 中,你不能使用 doInBackground() 来达到这个目的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-16
        • 1970-01-01
        相关资源
        最近更新 更多