2013-02-08 2 views
1

이 asyncTask 클래스는 Launcher Activity의 onCreate() 메소드에서 호출됩니다.이 2 AsyncTask 클래스에서 서비스를 호출하고 sqlite 데이터베이스에 데이터를 저장하려고합니다. 하지만이 2 asyncTask onPreExecute() 및 doInBackground() 메서드가 호출되었지만 onPostExecute() 메서드는 호출되지 않았습니다. 이런 일이 왜 병렬 작동하지 않는 2 AsyncTask를가이 당신에게AsyncTask 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(); 
       } 
      } 
     } 
    } 

감사, 제발 말해, 나는 다른 작업을 수행하는 것보다 후 첫 두 AsyncTask를 수행합니다. 그래서이

+0

여러 AsyncTask를 그렇게 작업 당신의 하나가 될 수있는 몇 가지 OS 버전에서 작동되지는 한 OnCreate에서 하나 개의 작업에 의해 하나를 확인하시기 바랍니다이 함께 문제가() 나는 생각 – Pratik

답변

1

는 코드의 라인 후, protected void onPostExecute(String response)의 하단에있는 super.onPostExecute(response);을 넣어하는 방법을 구현한다.

super.onPreExecute();super.onCancelled(result);도 방법에 따라 달라집니다.

+0

, 나는이 문제를 가지고 ,이 거기에 2 병렬 작업이 아닌 AsyncTask, 나는 먼저 다른 작업을 수행하는 것보다 AsyncTask 두 수행 싶습니다. 그래서 그것이 구현 된 방법 –

+0

이것은 나를 위해 일하게 만들었습니다. 고마워요 – MartinC

0

어쩌면 http 요청이 결과를 반환하지 않습니까? doInBackground에서 인터넷을 통한 상호 작용없이 많은 결과를 얻으십시오.

약 2 AsyncTask를 : 당신이 진정으로 병렬 실행을 원하는 경우에, 당신은 executeOnExecutor를 호출 할 수 있습니다 THREAD_POOL_EXECUTOR로 (java.util.concurrent.Executor를가, [] 객체)

. 여기에서

http://developer.android.com/reference/android/os/AsyncTask.html

+0

내가이 문제가있어,이 거기에 2 AsyncTask는 병렬로 작동하지 않습니다, 나는 먼저 다른 작업을 수행하는 것보다 AsyncTask 둘 다 수행하고 싶습니다. 어떻게 구현되는지 –

관련 문제