0

をフリーズします。問題は、そのUIスレッドをクラッシュさせることです。非同期タスクで実行されますが、引き続きUIで問題が発生します。私は本当に進歩について心配していません。ユーザーが本当に知っていることなく、そのことをやりたいだけです。Androidは非同期タスクに大きなsqllite書き込みを実行するには、だから私は最初の実行時にウェブからいくつかのデータを引き出し、dbテーブルにそれを書き込む必要があるアプリを書いていますUI

そのないデータのトン。 JSONレスポンスは600kb未満で、DB内の行数は約9,000行です。わずか30-45秒かかっていますが、私はむしろ残りのアプリをその時間に使えるようにしたいと思います。私は非同期タスクでDBを構築するために、セットアップのいくつかを持っているのはここ

です。

public void updateDBBackground() { 
    new UpdateDbTask().execute("", "", ""); 
} 


private class UpdateDbTask extends AsyncTask<String, String, String> { 
    protected String doInBackground(String... urls) { 
     long totalSize = 0; 
     open(); 
     String url = "someurl"; 

     JsonObjectRequest jsObjRequest = new JsonObjectRequest 
       (Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 

        @Override 
        public void onResponse(JSONObject response) { 
         try { 
          JSONArray queuearray = response.getJSONArray("items"); 
          for (int i = 0; i < queuearray.length(); i++) { 
           if (!queuearray.getJSONObject(i).getString("artist").isEmpty()) { 
            insert(queuearray.getJSONObject(i).getLong("id"), queuearray.getJSONObject(i).getString("item1"), queuearray.getJSONObject(i).getString("item2")); 
           } 
          } 

         } catch (Exception e) { 

         } 
        } 
       }, new Response.ErrorListener() { 

        @Override 
        public void onErrorResponse(VolleyError error) { 


        } 
       }); 

     VolleySig.getInstance(context).addToRequestQueue(jsObjRequest); 

     return ""; 
    } 

    protected void onProgressUpdate(String... progress) { 
    } 

    protected void onPostExecute(String result) { 
    } 
} 

私はすべてこれをメインアクティビティから呼び出します。

DBManager db = new DBManager(this); 
    if (!db.checkDb()) { 
     db.updateDBBackground(); 
    } 

ここにはクラッシュレポートのデータがあります。

09-04 17:20:29.065 18263-18270/com.SOMEAPP I/art: Thread[3,tid=18270,WaitingInMainSignalCatcherLoop,Thread*=0x7a74799000,peer=0x12ccb160,"Signal Catcher"]: reacting to signal 3 
09-04 17:20:29.155 18263-18270/com.SOMEAPP I/art: Wrote stack traces to '/data/anr/traces.txt' 

そしてここtraces.txt

の内容は

http://pastebin.com/traces

+0

あなたはまた、クラッシュダンプを貼り付けてくださいすることができますか?サービスを利用するために良いユースケースだ – dex

+0

は、あなたのタスクは、アクティビティの内部で実行する必要がある理由はありません。 – Egor

+0

関連するクラッシュデータを追加しました。私はサービスを使うことを考えました。一度のことのためにちょっと思った。それは、アプリが最初に行うことだからです。それを開き、自宅の活動に行ってください。 – Dandrews

答えて

0

である、それはバックグラウンドスレッドでアイテムをやっていますが、UIがハングする原因となったこと、それらを十分に産卵されたが判明。

私はいくつかの理由のためにレルムにSqlliteからDBを切り替えて、今ショーなどの項目をロードしています。場合によっては、UIラグの2〜2つがありますが、それほど重要ではありません。

private void UpdateDB() { 
    String url = "http://example.com&return=JSON"; 

    JsonObjectRequest jsObjRequest = new JsonObjectRequest 
      (Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         final JSONArray queuearray = response.getJSONArray("items"); 

         realmConfig = new RealmConfiguration.Builder(getApplicationContext()).build(); 
         // Open the Realm for the UI thread. 
         realm = Realm.getInstance(realmConfig); 


         realm.executeTransaction(new Realm.Transaction() { 
          @Override 
          public void execute(Realm realm) { 
           // Add a person 

           for (int i = 0; i < queuearray.length(); i++) { 

            try { 
             if (!queuearray.getJSONObject(i).getString("value").isEmpty()) { 
              Media media = realm.createObject(Media.class); 
              media.setValue(queuearray.getJSONObject(i).getString("value")); 
              media.setTitle(queuearray.getJSONObject(i).getString("title")); 
              media.setItemid(queuearray.getJSONObject(i).getLong("itemid")); 
             } 
            } catch (Exception e) { 

            } 
           } 

          } 
         }); 


        } catch (Exception e) { 


        } 
       } 
      }, new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }); 

    VolleySig.getInstance(this).addToRequestQueue(jsObjRequest); 

    realm.close(); 
} 
関連する問題