DB にオブジェクトを挿入するために使用するメソッドを含む SQLiteOpenHelper クラスがある場合、AsyncTask 内からこのメソッドを呼び出す場合、DB への呼び出しは別のスレッドまたはメイン UI スレッドで行われますか?
DB 呼び出しはバックグラウンド スレッドで行われると思います。asynctask クラスを正しく理解していませんか? asynctask を使用するには、SQLiteOpenHelper 内のすべての DB 呼び出しを書き直す必要がありますか?
現在、Android デバイスで多くの遅延が発生しており、次のようなメッセージが表示されます。
The application may be doing too much work on its main thread.
doinbackground メソッド内で解析し、項目を DB に挿入する json 文字列で応答する Web サービスを呼び出しています。
public class DB_Async {
public void replaceDeck(String jsonString, Delegate d){
ReplaceDeck del = new ReplaceDeck();
del.setDelegate(d);
del.addParameter("json", jsonString);
del.execute();
}
private class ReplaceDeck extends AsyncTask<String, Object, String> {
private Delegate delegate;
private Exception error;
private Hashtable<String, String> parameters = new Hashtable<String, String>();
public void setDelegate(Delegate d){
delegate = d;
}
public void addParameter(String key, String value){
parameters.put(key, value);
}
@Override
protected void onPreExecute() { //Main Thread
super.onPreExecute();
if(delegate != null)
delegate.onStart();
}
@Override
protected void onPostExecute(String result) { //Main Thread
super.onPostExecute(result);
if(delegate != null)
delegate.onResult(result, error);
}
protected String doInBackground(String... params){ //BACKGROUND THREAD
String currDate = new Date().toString();
SQLdataHelper mDataHelper = SQLdataHelper.getInstance();
String result = null;
String jsonString = parameters.get("json");
try {
JSONObject jsonObj = new JSONObject(jsonString);
JSONArray jsonDecks = jsonObj.getJSONArray("decks");
for(int i = 0; i < jsonDecks.length(); i++){
Deck newDeck = new Deck();
int new_deck_id = mDataHelper.addDeck(newDeck); // call to SQLOpenHelper
}
} catch (JSONException e) {
e.printStackTrace();
}catch(Exception e)
{
System.out.println(e);
result = e.getMessage();
error = e;
}
return result;
}
}
私の DB は新しい行を私の Decks 列に挿入するだけです:
public synchronized long addDeck(Deck deck){
String currDate = new Date().toString();
ContentValues values = new ContentValues();
values.put(DB_DECK_UID_COLUMN, deck.student_id);
values.put(DB_DECK_NAME_COLUMN, deck.name);
values.put(DB_DECK_DESC_COLUMN, deck.description);
values.put(DB_DECK_DIFFICULTY_COLUMN, deck.difficulty);
values.put(DB_DECK_COUNT_COLUMN, deck.cardCount);
values.put(DB_DECK_RATING_COLUMN, deck.rating);
values.put(DB_DECK_CREATED_COLUMN, currDate);
values.put(DB_DECK_UPDATED_COLUMN, currDate);
values.put(DB_DECK_WEBID_COLUMN, deck.web_id);
values.put(DB_DECK_NEED_SYNC, 0);
long deck_id = mDB.insert(DB_DECK_TABLE, null, values);
return deck_id;
}
このメソッドを呼び出すには、新しいデリゲートを作成し、ReplaceDeck を呼び出します。
DB_Async.Delegate asyncDelegate = new DB_Async.Delegate() {
@Override
public void onStart() {
// TODO Auto-generated method stub
}
@Override
public void onResult(String result, Exception e) {
Toast.makeText(mContext, "Successful Download", Toast.LENGTH_SHORT).show();
}
};
try{
DB_Async bf = new DB_Async(mContext);
bf.replaceDeck(jsonString, asyncDelegate);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}