Android 更新sqlite数据库并使用SimpleCursorAdapter导致UI挂起

Android 更新sqlite数据库并使用SimpleCursorAdapter导致UI挂起,android,sqlite,user-interface,bulkinsert,android-contentresolver,Android,Sqlite,User Interface,Bulkinsert,Android Contentresolver,编辑:tl;dr如何在不挂起listfragment的情况下使用content resolver和simpleCursorAdapter插入db 我有一个用于下载JSON数据的异步任务。在该任务的onPostExecute()中,我调用handleNewMessageResponse()以使用结果更新Sqlite数据库 handleNewMessageResponse()的代码 一切都很好,但有一个例外,下面的代码部分最多需要10秒来执行,并在10秒内挂起UI/列表 当UI挂起时,此部分处于关闭

编辑:tl;dr如何在不挂起listfragment的情况下使用content resolver和simpleCursorAdapter插入db

我有一个用于下载JSON数据的异步任务。在该任务的onPostExecute()中,我调用handleNewMessageResponse()以使用结果更新Sqlite数据库

handleNewMessageResponse()的代码

一切都很好,但有一个例外,下面的代码部分最多需要10秒来执行,并在10秒内挂起UI/列表

当UI挂起时,此部分处于关闭状态:

//Step 3. Populate DB with new info.
            for (int i = 0; i < mMessagesResponse.getMessages().length; i++) {
                Messages messages = mMessagesResponse.getMessages()[i];

                ContentValues values = new ContentValues();
                values.put("id", messages.getId());
                values.put("parent", messages.getParent());
                values.put("type", messages.getType());
                values.put("user", messages.getUser());
                values.put("subject", messages.getSubject());
                values.put("body", messages.getBody());
                values.put("datetime", messages.getDatetime());
                values.put("status", messages.getStatus());
                values.put("touched", messages.getTouched());

                //Perform the Insert.
                getActivity().getContentResolver().insert(
                        EntegraContentProvider.CONTENT_URI_MESSAGES, values);
//第三步。用新信息填充数据库。
for(int i=0;i
有人能给我指出正确的方向并告诉我这个看似普通的任务的标准方法是什么吗?这应该很简单,但我很难找到适合我的用例的例子

谢谢

这是我的最终代码。更加流畅:

私有类事件蚀刻器扩展异步任务{
私有静态最终字符串标记=“EventsFetcher”;
@覆盖
受保护事件响应doInBackground(字符串…参数){
EventsResponse returnResponse=null;
试一试{
//创建一个HTTP客户端
HttpClient=new DefaultHttpClient();
HttpPost=新的HttpPost(mEventsBaseUrl);
//执行请求并检查状态代码
HttpResponse response=client.execute(post);
StatusLine StatusLine=response.getStatusLine();
if(statusLine.getStatusCode()==200){
HttpEntity=response.getEntity();
InputStream内容=entity.getContent();
试一试{
//读取服务器响应并尝试将其解析为JSON
Reader Reader=新的InputStreamReader(内容);
Gson Gson=新的Gson();
returnResponse=gson.fromJson(reader,EventsResponse.class);
content.close();
}捕获(例外情况除外){
Log.e(标记“由于“+ex”,无法解析JSON);
failedGettingEvents();
}
}否则{
Log.e(标记“服务器响应状态代码:”+statusLine.getStatusCode());
failedGettingEvents();
}
}捕获(例外情况除外){
Log.e(标记“由于“+ex”,无法发送HTTP POST请求);
failedGettingEvents();
}
返回响应;
}
@凌驾
PostExecute上受保护的void(事件响应结果响应){
EventsResultsHandler resultsHandler=新的EventsResultsHandler();
执行(resultResponse);
}
}
私有类事件ResultsHandler扩展异步任务{
私有静态最终字符串TAG=“EventsResultsHandler”;
@凌驾
受保护的字符串doInBackground(事件响应…参数){
试一试{
EventsResponse evResponse=参数[0];
//第一步,确保我们得到了一些东西。
if(evResponse.getEvents().length>0){
//步骤2.用新信息填充数组。
List jsonResults=new ArrayList();
for(int i=0;i
您不想在UI线程上运行DB更新,因为这样会像您看到的那样挂起UI

B
    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    String[] uiBindFrom = { "user", "subject" };
    int[] uiBindTo = { R.id.messageUser , R.id.messageTitle };

    getLoaderManager().initLoader(MESSAGES_LIST_LOADER, null, this);

    adapter = new SimpleCursorAdapter(
            getActivity(), R.layout.messages_list_item,
            null, uiBindFrom, uiBindTo,
            CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

    setListAdapter(adapter);

}
//Step 3. Populate DB with new info.
            for (int i = 0; i < mMessagesResponse.getMessages().length; i++) {
                Messages messages = mMessagesResponse.getMessages()[i];

                ContentValues values = new ContentValues();
                values.put("id", messages.getId());
                values.put("parent", messages.getParent());
                values.put("type", messages.getType());
                values.put("user", messages.getUser());
                values.put("subject", messages.getSubject());
                values.put("body", messages.getBody());
                values.put("datetime", messages.getDatetime());
                values.put("status", messages.getStatus());
                values.put("touched", messages.getTouched());

                //Perform the Insert.
                getActivity().getContentResolver().insert(
                        EntegraContentProvider.CONTENT_URI_MESSAGES, values);
private class EventsFetcher extends AsyncTask<String, Void, EventsResponse> {
    private static final String TAG = "EventsFetcher";
    @Override
    protected EventsResponse doInBackground(String... params) {
        EventsResponse returnResponse = null;
        try {
            //Create an HTTP client
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(mEventsBaseUrl);

            //Perform the request and check the status code
            HttpResponse response = client.execute(post);
            StatusLine statusLine = response.getStatusLine();
            if(statusLine.getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();

                try {
                    //Read the server response and attempt to parse it as JSON
                    Reader reader = new InputStreamReader(content);

                    Gson gson = new Gson();

                    returnResponse=  gson.fromJson(reader, EventsResponse.class);

                    content.close();

                } catch (Exception ex) {
                    Log.e(TAG, "Failed to parse JSON due to: " + ex);
                    failedGettingEvents();
                }
            } else {
                Log.e(TAG, "Server responded with status code: " + statusLine.getStatusCode());
                failedGettingEvents();
            }
        } catch(Exception ex) {
            Log.e(TAG, "Failed to send HTTP POST request due to: " + ex);
            failedGettingEvents();
        }
        return returnResponse;
    }

    @Override
    protected void onPostExecute(EventsResponse resultResponse) {
        EventsResultsHandler resultsHandler = new EventsResultsHandler();
        resultsHandler.execute(resultResponse);
    }
}

private class EventsResultsHandler extends AsyncTask<EventsResponse, Void, String> {
    private static final String TAG = "EventsResultsHandler";

    @Override
    protected String doInBackground(EventsResponse... params) {

        try {

            EventsResponse evResponse = params[0];

            //Step 1. Ensure we got something back.
            if (evResponse.getEvents().length > 0){

                //Step 2. Populate Array with new info.
                List<ContentValues> jsonResults = new ArrayList<ContentValues>();
                for (int i = 0; i < evResponse.getEvents().length; i++) {

                    Events events = evResponse.getEvents()[i];
                    ContentValues values = new ContentValues();

                    values.put("start_date", events.getStart_date());
                    values.put("end_date", events.getEnd_date());
                    values.put("name", events.getName().replace("'","''"));
                    values.put("location", events.getLocation().replace("'","''"));
                    values.put("summary", events.getSummary().replace("'","''"));
                    values.put("lat", events.getLat());
                    values.put("lng", events.getLng());
                    values.put("is_active", events.getIs_active());
                    values.put("hide_calendar_button", events.getHide_calendar_button());
                    values.put("hide_map", events.getHide_map());

                    jsonResults.add(values);

                }

                //Step 3. Delete all data in table.
                getActivity().getContentResolver().delete(EntegraContentProvider.CONTENT_URI_EVENTS, null, null);

                //Step 4. Insert new data via via Bulk insert.
                getActivity().getContentResolver().bulkInsert(EntegraContentProvider.CONTENT_URI_EVENTS, jsonResults.toArray(new ContentValues[jsonResults.size()]));

                mWasDataLoaded = true;

            }

        } catch(Exception ex) {
            Log.e(TAG, "Failed to update results due to: " + ex);
            failedGettingEvents();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        mDataListener.onDataFetchComplete();
    }
}