1

この asyncTask クラスは、Launcher Activity の onCreate() メソッドで呼び出されます。この 2 つの AsyncTask クラスからサービスを呼び出して、sqlite データベースにデータを保存したいと考えています。しかし、これら 2 つの asyncTask onPreExecute() および doInBackground() メソッドでは呼び出されますが、onPostExecute() メソッドは呼び出されませんでした。どうしてこうなったのか教えてください よろしくお願いします

public class EcafeHome extends Activity 
{
    @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            new GetOfferData(EcafeHome.this).execute("runnable");
            new GetMenuData(EcafeHome.this).execute("params");
        }
}

    public class GetOfferData extends AsyncTask<String, Void, String>
    {
        Context mContext = null;
        public GetOfferData(Context mContext)
        {
            this.mContext = mContext;
        }

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            Log.d("GetOfferJsonData", "onPreExecute");
        }

        @Override
        protected String doInBackground(String... params)
        {
            Log.d("GetOfferJsonData", "doInBackground");
            return Common.InputStreamToString(Common.HTTP_GET(Constant.host, Constant.serviceUrlProt, Constant.URL.catagoryList));
        }

        @Override
        protected void onCancelled(String result) 
        {
            super.onCancelled(result);
            Log.d("GetOfferJsonData", "onCancelled");
        }

        @Override
        protected void onPostExecute(String response) 
        {
            super.onPostExecute(response);
            Log.d("GetOfferJsonData", "onPostExecute");
            if(response != null)
            {
                Log.d("response", response);
                try 
                {
                    JSONObject mJsonObject = new JSONObject(response);
                    JSONArray jArrayPackages = mJsonObject.getJSONArray(Constant.JSON_KEY.PACKAGE.PACKAGES); 

                    for(int i = 0; i < jArrayPackages.length(); i++)
                    {
                        JSONObject jObjectPackages = jArrayPackages.getJSONObject(i);

                        int packageId = jObjectPackages.getInt(Constant.JSON_KEY.PACKAGE.ID);

                        String pkgName = jObjectPackages.getString(Constant.JSON_KEY.PACKAGE.NAME);

                        int pkgprice = jObjectPackages.getInt(Constant.JSON_KEY.PACKAGE.PRICE);

                        String pkgpic = jObjectPackages.getString(Constant.JSON_KEY.PACKAGE.PIC);

                        DBConstant.openDatabase(mContext);
                        Cursor cursorOffer = DBConstant.mDBHelper.getPackageInfo(DBConstant.mSQLiteDatabase, packageId); 
                        if(cursorOffer != null)
                        {
                            Log.d("package offer", ""+cursorOffer.getCount());
                            if(cursorOffer.getCount() == 0)
                            {
                                DBConstant.mDBHelper.insertPackageInfo(DBConstant.mSQLiteDatabase, packageId, pkgName, pkgprice, pkgpic);
                            }
                        }
                        else
                        {

                        }
                        if(!cursorOffer.isClosed())
                            cursorOffer.close();

                        JSONArray jArrayPackageItem = jObjectPackages.getJSONArray(Constant.JSON_KEY.PACKAGE.PACKAGE_ITEMS);

                        for(int j = 0; j < jArrayPackageItem.length(); j++) 
                        {
                            JSONObject jObjectPackageItem = jArrayPackageItem.getJSONObject(j);
                            int pkgItemID = jObjectPackageItem.getInt(Constant.JSON_KEY.PACKAGE_ITEM.ID);

                            int pkgItemQnty = jObjectPackageItem.getInt(Constant.JSON_KEY.PACKAGE_ITEM.QUANTITY);

                            int menuitemid = jObjectPackageItem.getInt(Constant.JSON_KEY.PACKAGE_ITEM.MENU_ITEM_ID);

                            int pkgID = jObjectPackageItem.getInt(Constant.JSON_KEY.PACKAGE_ITEM.PACKAGE_ID);

                            //DBConstant.mDBHelper.insertPackageItemInfo(DBConstant.mSQLiteDatabase, pkgItemID, pkgID, menuitemid, pkgItemQnty);
                            DBConstant.openDatabase(mContext);
                            Cursor cursorOfferItem = DBConstant.mDBHelper.getPackageItemInfo(DBConstant.mSQLiteDatabase, pkgItemID); 
                            if(cursorOfferItem != null)
                            {
                                Log.d("package Item offer", ""+cursorOfferItem.getCount());
                                if(cursorOfferItem.getCount() == 0)
                                {
                                    DBConstant.mDBHelper.insertPackageItemInfo(DBConstant.mSQLiteDatabase, pkgItemID, pkgID, menuitemid, pkgItemQnty);
                                }
                            }
                            if(!cursorOfferItem.isClosed())
                                cursorOfferItem.close();

                            DBConstant.closeDatabase(); 
                        }
                    }

                }
                catch (JSONException e) 
                {
                    e.printStackTrace();
                }
            }
        }
    }

これには、並行して動作しない 2 つの AsyncTask があります。他のタスクを実行するよりも、最初に両方の AsyncTask を実行したいと考えています。それがどのように実装されているか

4

2 に答える 2

1

コードの行の後に、super.onPostExecute(response);の下部にを置きます。protected void onPostExecute(String response)

またsuper.onPreExecute();super.onCancelled(result);彼らの方法について。

于 2013-02-08T09:49:16.480 に答える
0

多分あなたはhttpリクエストが結果を返さないのですか?doInBackgroundインターネットとのやり取りなしで多くの結果を返すようにしてください。

2 つの AsyncTask について:

本当に並列実行が必要な場合は、THREAD_POOL_EXECUTOR を使用して executeOnExecutor(java.util.concurrent.Executor, Object[]) を呼び出すことができます。

ここからhttp://developer.android.com/reference/android/os/AsyncTask.html

于 2013-02-08T10:03:48.420 に答える