2012-07-11 132 views
0

我有一個同步邏輯使得從android到db的sendOrder通過在doInBackgroud()上運行的web服務來運行。DoInBackground不能第二次工作

首先我啓動應用程序。 然後點擊SyncClick和It同步數據庫沒有錯誤。 之後,我進入應用程序添加someorder到orderTable 返回到主屏幕(其中有SyncClick),我再次點擊SyncClick。 它發送命令(意思是sendOrder()功能正常) 之後,重置數據庫並獲得最新的數據在doInBackgroud()。 但它得到這個錯誤;

07-11 23:38:15.406: E/AndroidRuntime(7864): java.lang.RuntimeException: An error occured while executing doInBackground() 

07-11 23:38:15.406: E/AndroidRuntime(7864): Caused by: java.lang.NullPointerException 

後,我開始應用並點擊SyncClick再次效果很好。所以它不工作後,我添加了一些命令,然後同步,但沒有任何添加任何順序很好。

尋找問題。 感謝您的時間提前。

public void SyncClick(View v) 
    { 
     Loading = (ImageView)findViewById(R.id.imgLoadingAnim); 
     LoadingLayout = (LinearLayout)findViewById(R.id.loLoadingAnim); 
     LoadingLayout.setVisibility(VISIBLE); 
     Loading.setBackgroundResource(R.drawable.loading); 
     frameAnimation= (AnimationDrawable)Loading.getBackground(); 
     frameAnimation.setCallback(Loading); 
     frameAnimation.setVisible(true, true); 
     frameAnimation.start(); 

     if(!this.dhn.isTableExists("Orders")) 
     { 
      updateDB(); 
     } 

     sendOrder();  
    } 


    public void sendOrder() 
    { 
     ArrayList<Object[]> argumentsList = new ArrayList<Object[]>(); 
     Object[] stuff = {this.dhn, this}; 
     //SEND 
     ArrayList<Order> orders = this.dhn.GetOrders(); 

     for(int i = 0 ; i < orders.size(); i++) 
     { 
      ArrayList<OrderItem> orderItems = this.dhn.GetOrderItems(orders.get(i).ID); 

      String orderItemsS = ""; 

      for(int r = 0 ; r < orderItems.size(); r++) 
      { 
       orderItemsS = orderItemsS + orderItems.get(r).FinalCode + "|" + orderItems.get(r).Quantity + "|" + 
       orderItems.get(r).Price + "|" + orderItems.get(r).Discount + "|" + orderItems.get(r).Status + "|" + "#"; 
      } 

      orderItemsS = orderItemsS.substring(0, orderItemsS.length() - 1); 

      Object[] arguments = { 
        new String("OrderAdd"), 
        stuff, 

        new String("UserId"), 
        new Integer (orders.get(i).UserId), 
        new String("int"), 

        new String("CustomerId"), 
        new Integer (orders.get(i).CustomerId), 
        new String("int"), 

        new String("Price"), 
        new Double (orders.get(i).Price), 
        new String("double"), 

        new String("Discount"), 
        new Double (orders.get(i).Discount), 
        new String("double"), 

        new String("Status"), 
        new Integer (orders.get(i).Status), 
        new String("int"), 

        new String("orderItems"), 
        new String (orderItemsS), 
        new String("String") 
        }; 

      argumentsList.add(arguments); 
     } 

     Object[] stuffALL = {this.dhn, this, argumentsList}; 


     Object[] argumentsALL = { 
       new String("recieveALL"), 
       stuffALL 
       }; 

     //ConnectXML runXMLALL = new ConnectXML(); 
     new ConnectXML().execute(argumentsALL); 


     Status = 1; 

     updateDB(); 

     receive(); 
    } 

    public void receive() 
    { 
     Object[] stuff = {this.dhn, this}; 
     ArrayList<Object[]> argumentsList1 = new ArrayList<Object[]>(); 

     //receive 
     Object[] arguments = { 
       new String("ProductListGet"), 
       stuff, 
       new String("CatID"), 
       new Integer (-1), 
       new String("int") 
       }; 
     argumentsList1.add(arguments); 
     Object[] arguments1 = { 
       new String("CustomerListGet"), 
       stuff 
       }; 
     argumentsList1.add(arguments1); 
     Object[] arguments2 = { 
       new String("CategoryListGet"), 
       stuff, 
       new String("ParentID"), 
       new Integer (-2), 
       new String("int") 
       }; 
     argumentsList1.add(arguments2); 
     Object[] arguments3 = { 
       new String("UserListGet"), 
       stuff 
       }; 
     argumentsList1.add(arguments3); 
     Object[] arguments5 = { 
       new String("ProductCategoriesListGet"), 
       stuff 
       }; 
     argumentsList1.add(arguments5); 
     Object[] arguments6 = { 
       new String("ProductOptionListGet"), 
       stuff 
       }; 
     argumentsList1.add(arguments6); 
     Object[] arguments7 = { 
       new String("FinalProductListGet"), 
       stuff 
       }; 
     argumentsList1.add(arguments7); 
     Object[] arguments8 = { 
       new String("ProductDiscountsListGet"), 
       stuff 
       }; 
     argumentsList1.add(arguments8); 
     Object[] arguments9 = { 
       new String("ProductPriceGroupListGet"), 
       stuff 
       }; 
     argumentsList1.add(arguments9); 
     Object[] arguments10 = { 
       new String("OptionListGet"), 
       stuff 
       }; 
     argumentsList1.add(arguments10); 


     Object[] stuffALL1 = {this.dhn, this, argumentsList1}; 


     Object[] argumentsALL1 = { 
       new String("recieveALL"), 
       stuffALL1 
       }; 

     //ConnectXML runXMLALL1 = new ConnectXML(); 
     new ConnectXML().execute(argumentsALL1); 
    } 

    int Stat; 
    int Status; 
    public void LoadAnim() 
    { 
     if(Status == 1) 
     { 
      Stat++; 
      if(Stat > 0) 
      { 
       LoadingLayout.setVisibility(GONE); 
       if(frameAnimation !=null && frameAnimation.isRunning()) 
       { 
        frameAnimation.stop(); 
        Stat = 0; 
        Status = 0; 
       } 
      } 
     } 
    } 

    public void updateDB() 
    { 
     this.dhn.close(); 

     try { 
      InputStream myInput; 

       myInput = getAssets().open("sistem.db"); 

      // Path to the just created empty db 
      String outFileName = "/data/data/sistem.ss/databases/" 
        + "sistem.db"; 

      // Open the empty db as the output stream 
      OutputStream myOutput = new FileOutputStream(outFileName); 

      // transfer bytes from the inputfile to the outputfile 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = myInput.read(buffer)) > 0) { 
       myOutput.write(buffer, 0, length); 
      } 

      // Close the streams 
      myOutput.flush(); 
      myOutput.close(); 
      myInput.close(); 
      buffer = null; 
      outFileName = null; 
      this.dhn.close(); 
      this.dhn = null; 
      this.dhn = DataHelper.getDataHelper(this); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
    } 

logcat的

07-12 07:31:59.879: E/AndroidRuntime(2873): FATAL EXCEPTION: AsyncTask #1 
07-12 07:31:59.879: E/AndroidRuntime(2873): java.lang.RuntimeException: An error occured while executing doInBackground() 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at java.lang.Thread.run(Thread.java:1096) 
07-12 07:31:59.879: E/AndroidRuntime(2873): Caused by: java.lang.NullPointerException 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at sistem.ss.ConnectXML.doInBackground(ConnectXML.java:79) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at sistem.ss.ConnectXML.doInBackground(ConnectXML.java:1) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
07-12 07:31:59.879: E/AndroidRuntime(2873):  ... 4 more 
+0

你可以發佈整個LogCat輸出嗎?只是「由......引起:java.lang.NullPointerException」不足以繼續。應該有一行指向您的代碼中發生空指針的行。 – Eric 2012-07-11 23:21:56

+0

你有沒有考慮過使用AsycTask呢? – BlackHatSamurai 2012-07-11 23:22:55

+0

@Soxxeh我加了logcat .. – Mert 2012-07-12 07:10:35

回答

2

我尚未有機會與的AsyncTask工作,但documentation說:

任務只能執行一次(一個例外會如果試圖執行第二次執行,則會被拋出。)

這意味着您可以不需要創建一個新的實例並在那個實例上執行。例如。

new WhateverYourTaskIsCalled().execute(...); 

而不是在您已經使用的實例上調用​​。

+0

對於遲到的回覆感到抱歉,我只是編輯了一下我的代碼,作爲您在有疑問的頂部的建議。但仍然給我java.lang.NullPointerException ..我有斷點開始的doInBackground()它在斷點上跳轉,工作看起來很好,但仍然因爲異常而暗戀。還嘗試創建一個公共任務,並使用第二次,但它說「引起通過:java.lang.IllegalStateException:無法執行任務:該任務已在運行。「感謝你等待你的時間 – Mert 2012-07-12 07:06:45

+0

@Mert聽起來你已經在適當的時候使用了一個新的實例,但是你的代碼中有一些其他的錯誤。看看引發'NullPointerException'的確切行,並試圖找出你所做的假設是不正確的(該行的某些內容是'null',並且你認爲它不應該是)。如果你無法弄清楚,你需要發佈相關的代碼(你得到Exception的地方和周圍環境)。 – 2012-07-12 07:31:58

+0

我在doInBackground()中發現了這個問題..這是一個愚蠢的問題。帶走了你們的時間。對不起。我感謝你的時間,所以我接受你的努力的答案。再次感謝。 – Mert 2012-07-12 21:36:25