2017-05-11 11 views
-1

私のアプリでは、Webから大量のデータをロードしていて、sqliteテーブルにデータを挿入すると、sqliteテーブルにデータを格納するときにApp AppのUIが遅くなり、ANRダイアログが表示されます。 ウェブからの負荷データのための私のコードとは、アプリのISN」スロー取得このコード私のアプリのUIを実行するとsqliteのテーブルバルクデータをsqliteに挿入すると、UIが遅くなる

public void insertAiports(String airportCityName, String aiportCityCode, String airportName, String airportConutryName) { 

      SQLiteDatabase database = getWritableDatabase(); 

      ContentValues values = new ContentValues(); 
      values.put(AIRPORT_FIELD_CITY_NAME, airportCityName); 
      values.put(AIRPORT_FIELD_CITY_CODE, aiportCityCode); 
      values.put(AIRPORT_FIELD_NAME, airportName); 
      values.put(AIRPORT_FIELD_COUNTRY_NAME, airportConutryName); 

      database.insert(TABLE_AIRPORTS, null, values); 
     } 

にsqliteのテーブルに挿入するデータのための

StringRequest request = new StringRequest(url, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        try { 
         JSONArray array = new JSONArray(response); 
         if (array.length() != 0) { 
          for (int i = 0; i < array.length(); i++) { 
           JSONObject object = array.getJSONObject(i); 
           AirportModel model = new AirportModel(); 

           String cityName = object.getString("airport_city_name"); 
           String cityCode = object.getString("airport_city_code"); 
           String country = object.getString("airport_country_name"); 
           String name = object.getString("airport_name"); 

           dbHelper.insertAiports(cityName, cityCode, name, country); 
          } 
         } 
         Toast.makeText(getApplicationContext(), String.valueOf(array.length()), Toast.LENGTH_SHORT).show(); 

        } catch (JSONException e) { 
         e.printStackTrace(); 
         Toast.makeText(getApplicationContext(), "Founded JSON Exception", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Toast.makeText(FlightSearchActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); 
       } 
      }); 
      RequestQueue queue = Volley.newRequestQueue(FlightSearchActivity.this); 
      queue.add(request); 

この私のコードを挿入し、ダイアログを表示します応答しません。 終了しますか? 誰でも、私のUIがぶら下がることなく、バルクデータをsqliteテーブルに挿入することを提案することができます。

答えて

0

それは時間がかかるため、別のスレッド上のデータベース操作を実行します。あなたが使用することができます。

1.AsyncTask 
2.Service 
+0

あなたは私のコードでAsyncTaskやサービスを追加してくださいすることができ、それを使用する方法 –

0

使用を 見て、それのデモで、その下にJSONデータを取得し、sqliteのにデータを追加AsyncTask:

public class MainActivity extends AppCompatActivity { 
    private Button button; 
    private EditText time; 
    private TextView finalResult; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     time = (EditText) findViewById(R.id.in_time); 
     button = (Button) findViewById(R.id.btn_run); 
     finalResult = (TextView) findViewById(R.id.tv_result); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       AsyncTaskRunner runner = new AsyncTaskRunner(); 
       String sleepTime = time.getText().toString(); 
       runner .execute(sleepTime); 
      } 
     }); 
    } 

    private class AsyncTaskRunner extends AsyncTask<String, String, String> { 

     private String resp; 
     ProgressDialog progressDialog; 

     @Override 
     protected String doInBackground(String... params) { 
      publishProgress("Sleeping..."); // Calls onProgressUpdate() 
      try { 
       int time = Integer.parseInt(params[0])*1000; 

       Thread.sleep(time); 
       resp = "Slept for " + params[0] + " seconds"; 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
       resp = e.getMessage(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       resp = e.getMessage(); 
      } 
      return resp; 
     } 


     @Override 
     protected void onPostExecute(String result) { 
      // execution of result of Long time consuming operation 
      progressDialog.dismiss(); 
      finalResult.setText(result); 
     } 


     @Override 
     protected void onPreExecute() { 
      progressDialog = ProgressDialog.show(MainActivity.this, 
        "ProgressDialog", 
        "Wait for "+time.getText().toString()+ " seconds"); 
     } 


     @Override 
     protected void onProgressUpdate(String... text) { 
      finalResult.setText(text[0]); 

     } 
    } 
} 
1

あなたはデシベルで一括操作を行っている場合は、使用取引より良いパフォーマンスのために。

例:

db.beginTransaction(); 

    try { 
     // do your bulk insert 
     db.setTransactionSuccessful(); 
    } finally { 
     db.endTransaction(); 
    } 
関連する問題