Sqlite操作的数量块在Android异步Http客户端onSuccess()中阻止UI

时间:2014-03-06 05:06:52

标签: android sqlite http asynchronous block

@Override
public void onStart() {
    setCharset("GB2312");
    progess_bar_PopupWindow();
}

@Override
public void onSuccess(String response) {
    String[] split_array = JwcRegex
            .parse_department_list(response);
    Sql.dep_update(split_array);//here contain amount of sql insert operation
    Toast.makeText(getApplicationContext(), "hello rex",
            Toast.LENGTH_LONG).show();
    if (pw_progress_window.isShowing()) {
        pw_progress_window.dismiss();
    }
}

当http请求开始时,progess_bar_PopupWindow()显示具有进度条的popwindow,但进度条仍在进行,请求在我的onSuccess()之后关闭。但删除了Sql.dep_update(split_array),进度条效果很好。怎么处理?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。如下:

  1. 在Sql类中添加与query和exec方法同步 由并发读/写sqlite引起的一些错误。 synchronized关键字可以同步操作

  2. 将popwindow(包含我的进度条)放在showAtLocation()方法中显示方法onWindowFocusChanged()

  3. 将具有操作量的方法放在新线程中。代码如下:

  4. @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        if (!hasLoad) {
            get_departments();
            hasLoad = true;
        }
    }
    
    public void exec(String sql) {
        synchronized (this) {
            db.execSQL(sql);
        }
    }
    
    @Override
    public void onSuccess(String response) {
        Yangtzeu.TempString = JwcRegex
            .parse_department_list(response);
    
        if (pw_progress_window.isShowing()) {
            pw_progress_window.dismiss();
        }
    
        new Thread(new Runnable() {
            public void run() {
                JwcDB.dep_update(Yangtzeu.TempString);
                ComDB.kv_set("dep_list_exp", "false");
            }
        }).start();
    }