0

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

1 に答える 1

0

doinbackground メソッド内で解析し、項目を DB に挿入する json 文字列で応答する Web サービスを呼び出しています。

replaceDeckUIスレッドでWebサービス呼び出しを行い、それをパラメーターとして渡してAsyncTaskdoinbackground 内で開始および解析しようとしていることを意味します。

また、 AsyncTask の doinbackground メソッド内に関連するコードを呼び出す Web サービスを配置する必要があります。このために、2 つの AsyncTask を使用して、1 つを Web サービスを呼び出してデータを取得し、2 つ目を DB にデータを挿入することができます。

于 2013-01-23T18:31:06.477 に答える