2017-05-11 63 views
-1

在我的应用程序我从Web加载批量数据,它插入到sqlite表,当我存储数据到sqlite表我的应用程序用户界面变得缓慢,并显示ANR对话框, 下面是我从网络加载数据的代码,并插入到SQLite表当批量数据插入sqlite得到缓慢我的UI

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); 

用于插入数据的这种我的代码SQLite表

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); 
     } 

运行这段代码我的应用程序的用户界面越来越慢时,并显示对话框中的“应用程序ISN '没有回应 你想要亲近吗?“ 任何人都可以建议将批量数据插入sqlite表而不挂我的UI。

回答

0

在单独的线程中执行数据库操作,因为它需要时间。你可以使用:

1.AsyncTask 
2.Service 
+0

如何使用它,你可以请加的AsyncTask或服务在我的代码 –

0

使用的AsyncTask获取JSON数据在IT和数据添加到sqlite的, 看看它的演示:

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做批量操作,使用交易获得更好的性能。

如:

db.beginTransaction(); 

    try { 
     // do your bulk insert 
     db.setTransactionSuccessful(); 
    } finally { 
     db.endTransaction(); 
    }