2015-04-21 33 views
0

我已經在後臺線程上實現了JSON解析器,然後嘗試使用一些嵌入式代碼將數據寫入UI線程中的一系列TableRows,把我放回正常的UI線程。該代碼會不斷地回來與該堆棧跟蹤使用AsyncTask中的數據在UI線程上編寫TableRow線程

Process: webmd.mmu.ac.uk.wmfinal3, PID: 6123 
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
     at android.view.ViewGroup.addViewInner(ViewGroup.java:3562) 
     at android.view.ViewGroup.addView(ViewGroup.java:3415) 
     at android.widget.TableLayout.addView(TableLayout.java:429) 
     at android.view.ViewGroup.addView(ViewGroup.java:3360) 
     at android.widget.TableLayout.addView(TableLayout.java:411) 
     at android.view.ViewGroup.addView(ViewGroup.java:3336) 
     at android.widget.TableLayout.addView(TableLayout.java:402) 
     at  webmd.mmu.ac.uk.wmfinal3.MainActivity$ProgressTask$1$1.run(MainActivity.java:244) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5017) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
     at dalvik.system.NativeStart.main(Native Method) 
04-21 14:58:08.506 6199-6199/webmd.mmu.ac.uk.wmfinal3 D/gralloc_goldfish﹕ Emulator without GPU emulation detected. 
04-21 14:58:11.316 6199-6215/webmd.mmu.ac.uk.wmfinal3 D/dalvikvm﹕ GC_FOR_ALLOC freed 209K, 10% free 3129K/3460K, paused 2ms, total 2ms 
04-21 14:58:11.336 6199-6199/webmd.mmu.ac.uk.wmfinal3 D/AndroidRuntime﹕ Shutting down VM 
04-21 14:58:11.336 6199-6199/webmd.mmu.ac.uk.wmfinal3 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xb0cb3b20) 
04-21 14:58:11.336 6199-6199/webmd.mmu.ac.uk.wmfinal3 E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: webmd.mmu.ac.uk.wmfinal3, PID: 6199 
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
     at android.view.ViewGroup.addViewInner(ViewGroup.java:3562) 
     at android.view.ViewGroup.addView(ViewGroup.java:3415) 
     at android.widget.TableLayout.addView(TableLayout.java:429) 
     at android.view.ViewGroup.addView(ViewGroup.java:3360) 
     at android.widget.TableLayout.addView(TableLayout.java:411) 
     at android.view.ViewGroup.addView(ViewGroup.java:3336) 
     at android.widget.TableLayout.addView(TableLayout.java:402) 
     at webmd.mmu.ac.uk.wmfinal3.MainActivity$ProgressTask$1$1.run(MainActivity.java:245) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5017) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
     at dalvik.system.NativeStart.main(Native Method) 

我試圖將所有的代碼放到的AsyncTask但隨後它要求要對UI線程。

這是我的代碼。任何幫助將非常感激。

protected Boolean doInBackground(final String... args) { 
final TableLayout tl = (TableLayout) findViewById(R.id.table); 
final TableRow v1 = new TableRow(MainActivity.this); 
     JSONParser jParser = new JSONParser(); 
     String temp = "http://sandbox.kriswelsh.com/hygieneapi/hygiene.php?op=nearest&lat=" + latitude + "&long=" + longitude; 
     JSONArray json = jParser.getJSONFromUrl(temp); 
int [] test = new int [10]; 
     for (int i = 0; i < 10; i++) { 

      try { 
       JSONObject c = json.getJSONObject(i); 
       String vid = c.getString(id); 
       String vbn = c.getString(BusinessName); 
       String va1 = c.getString(Add1); 
       String va2 = c.getString(Add2); 
       String va3 = c.getString(Add3); 
       String vpost = c.getString(Post); 
       String vlong = c.getString(longitudej); 
       String vrate = c.getString(RatingDate); 
       String vratestar = c.getString(Rating); 
       String vlat = c.getString(latitudej); 

       if (vratestar.contentEquals("-1")) { 
        vratestar = "Exempt"; 
       } 




       //testing(vbn,va1,va2,va3,vpost,vratestar); 
       //TableLayout tl = (TableLayout) findViewById(R.id.table); 


       isRunning = true; 
       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 
         while (isRunning) { 
          try { 
           // Thread.sleep(10000); 
           mHandler.post(new Runnable() { 

            @Override 
            public void run() { 
             // TODO Auto-generated method stub 

             tl.addView(v1); 


            } 
           }); 
          } catch (Exception e) { 
           // TODO: handle exception 
          } 
         } 
        } 
       }).start(); 
       isRunning = false; 

       //jsonlist.add(map); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
      return null; 
     } 

UPDATE:現在顯示V1初始化

+0

你不應該更新doInBackground中的UI。你應該返回它,並覆蓋後處理應該處理所有用戶界面邏輯 –

+0

請顯示'v1'初始化 – nikis

回答

0

看着你while (isRunning)循環,我想你想添加相同v1TableRow欣賞到TableLayout在每次迭代(然而,這只是一種猜測,因爲你沒有發佈v1聲明)。當然,第二次它會給你一個錯誤,因爲它已經有了父對象,你應該每次創建新的對象TableRow。更深入的,你不需要Handler這是連接到UI線程,因爲你正在使用AsyncTask,你可以利用這個事實,即onPostExecute方法在主線程上執行。考慮到它,你可以寫下面的AsyncTask執行:

class MyAsyncTask extends AsyncTask<Void, Void, JSONArray>{ 

    @Override 
    protected JSONArray doInBackground(Void... params) { 
     JSONParser jParser = new JSONParser(); 
     String temp = "http://sandbox.kriswelsh.com/hygieneapi/hygiene.php?op=nearest&lat=" + latitude + "&long=" + longitude; 
     JSONArray json = jParser.getJSONFromUrl(temp); 
     return json; 
    } 

    @Override 
    protected void onPostExecute(JSONArray json) { 
     TableLayout tl = (TableLayout) findViewById(R.id.table); 
     for (int i = 0; i < 10; i++) { 

      try { 
       JSONObject c = json.getJSONObject(i); 
       String vid = c.getString(id); 
       String vbn = c.getString(BusinessName); 
       String va1 = c.getString(Add1); 
       String va2 = c.getString(Add2); 
       String va3 = c.getString(Add3); 
       String vpost = c.getString(Post); 
       String vlong = c.getString(longitudej); 
       String vrate = c.getString(RatingDate); 
       String vratestar = c.getString(Rating); 
       String vlat = c.getString(latitudej); 

       if (vratestar.contentEquals("-1")) { 
        vratestar = "Exempt"; 
       } 

       TableRow tableRow = new TableRow(context); 
       //configuring row, setting layout params 
       tl.addView(tableRow); 

      } catch (JSONException ex){ 
       //error handling 
      } 
     } 
    } 
} 
+0

這工作得很好,非常感謝。 –