2013-05-16 88 views
0

我正試圖在我的應用程序中實現一個選項卡。所以,我必須將這些活動作爲兒童活動來開展。但是,當我開始某個孩子的活動時會出現問題,而不是其他活動。所以也許有一些活動。當我比較兩個另一個,發生錯誤的地方是執行一個異步任務。也許這是原因。這是我的日誌說:以AsyncTask作爲兒童活動開始活動

05-16 18:21:00.475: E/AndroidRuntime(1572): FATAL EXCEPTION: main 
    05-16 18:21:00.475: E/AndroidRuntime(1572): java.lang.IllegalStateException: Could not execute method of the activity 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.View$1.onClick(View.java:3044) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.View.performClick(View.java:3511) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.View$PerformClick.run(View.java:14105) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.os.Handler.handleCallback(Handler.java:605) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.os.Handler.dispatchMessage(Handler.java:92) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.os.Looper.loop(Looper.java:137) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.ActivityThread.main(ActivityThread.java:4446) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at java.lang.reflect.Method.invokeNative(Native Method) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at java.lang.reflect.Method.invoke(Method.java:511) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at dalvik.system.NativeStart.main(Native Method) 
    05-16 18:21:00.475: E/AndroidRuntime(1572): Caused by: java.lang.reflect.InvocationTargetException 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at java.lang.reflect.Method.invokeNative(Native Method) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at java.lang.reflect.Method.invoke(Method.java:511) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.View$1.onClick(View.java:3039) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  ... 11 more 
    05-16 18:21:00.475: E/AndroidRuntime(1572): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.project/com.test.project.ProductActivity}: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$Lo[email protected] is not valid; is your activity running? 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1978) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.ActivityThread.startActivityNow(ActivityThread.java:1819) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at com.test.project.ParentTabActivity.startChildActivity(ParentTabActivity.java:276) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at com.test.project.ActivityGroup.showInvoice4(ActivityGroup.java:34) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  ... 14 more 
    05-16 18:21:00.475: E/AndroidRuntime(1572): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.ViewRootImpl.setView(ViewRootImpl.java:513) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.view.Window$LocalWindowManager.addView(Window.java:537) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.Dialog.show(Dialog.java:278) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.ProgressDialog.show(ProgressDialog.java:116) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.ProgressDialog.show(ProgressDialog.java:99) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.ProgressDialog.show(ProgressDialog.java:94) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at com.test.project.ProductActivity$BusinessIdListRequestForEverything2.onPreExecute(ProductActivity.java:2984) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.os.AsyncTask.execute(AsyncTask.java:511) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at com.test.project.ProductActivity.initialPopulateAllShop(ProductActivity.java:2501) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at com.test.project.ProductActivity.populateData3(ProductActivity.java:2408) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at com.test.project.ProductActivity.onCreate(ProductActivity.java:250) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.Activity.performCreate(Activity.java:4465) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1942) 
    05-16 18:21:00.475: E/AndroidRuntime(1572):  ... 19 more 

關於這件事的任何啓示。任何幫助是極大的讚賞。由於

[編輯:我的代碼]

這是我MainActivity

TabSpec clipBoard = tabHost.newTabSpec("FirstActivity"); 
      Intent firstIntent = new Intent(this, GroupTabActivity.class); 

      clipBoard.setIndicator(view1); 
      clipBoard.setContent(firstIntent); 

      TabSpec photos = tabHost.newTabSpec("ProductActivity"); 
      Intent secondIntent = new Intent(this, GroupTabActivity.class); 
      photos.setIndicator(view2); 
      photos.setContent(secondIntent); 

然後GroupTabActivity extends TabParentActivity TabParentActivity延伸到ActivityGroup

public class GroupTabActivity extends ParentTabActivity { 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Log.d("## this1", getParent().getClass().getSimpleName()); 
      startChildActivity("ActivityGroup", new Intent(this,ActivityGroup.class)); 
     } 

最後,ActivityGroup extends TabParentActivity

 public void onButtonClick1(View v){ 
      Intent intent = new Intent(getParent(), FirstActivity.class); 
      TabParentActivity parentActivity = (TabParentActivity)getParent(); 
      parentActivity.startChildActivity("FirstActivity", intent); 
      } 
     public void onButtonClick2(View v){ 
      Intent intent = new Intent(getParent(), ProductActivity.class); 
      TabParentActivity parentActivity = (TabParentActivity)getParent(); 
      parentActivity.startChildActivity("ProductActivity", intent); 

     } 

在onclick2之後,我遇到了那個錯誤。 ProductActivity包含一個asynctask。

在日誌中,行2984: 在ProductActivity:

@Override 
    protected void onPreExecute() { 
     if (mainProgressDialog == null){ 
      mainProgressDialog = ProgressDialog.show(ProductActivity.this, "", getString(R.string.loading)); 
     }else{ 
      if (mainProgressDialog.isShowing()==false){ 
       mainProgressDialog = ProgressDialog.show(ProductActivity.this, "", getString(R.string.loading)); 
      } 
     } 
     super.onPreExecute(); 
    } 

UPDATE: 的AsyncTask:當您試圖表明對已經破壞Activity對話框

private class BusinessIdListRequestForEverything2 extends AsyncTask<String, Void, String>{ 
     ApiService service; 
     String mode = ""; //either all or shop 
     String indicator = ""; 
     List <BusinessDetailsRequestForEverything2> businessRequestList = null; 
     int numberOfBusinessRequests = 0; 

     public String getIndicator() { 
      return indicator; 
     } 
     public void setIndicator(String indicator) { 
      this.indicator = indicator; 
     } 

     public ApiService getService() { 
      return service; 
     } 
     public void setService(ApiService service) { 
      this.service = service; 
     } 
     public BusinessIdListRequestForEverything2(ApiService service){ 
      this.service = service; 
      businessRequestList = new ArrayList<BusinessDetailsRequestForEverything2>(); 
     } 
     @Override 
     protected String doInBackground(String... params) { 
      service.execute(RequestMethod.POST); 
      return null; 
     } 

     /** 
     * checks all getBusiness api requests if finished 
     * 
     * @return 
     */ 
     public boolean isBusinessRequestsFinished(){ 
      boolean retVal = false; 
      int counter = 0; 
      if (businessRequestList!=null && businessRequestList.size()>0){ 
       for(BusinessDetailsRequestForEverything2 request: businessRequestList){ 
        if (request.getStatus()==AsyncTask.Status.FINISHED){ 
         counter++; 
        } 
       } 
       if (counter == numberOfBusinessRequests){ 
        retVal = true; 
       } 
      } 
      return retVal; 
     } 

     public void stopAllBusinessDetailsRequestEverything(){ 
      if (businessRequestList!=null && businessRequestList.size()>0){ 
       for(BusinessDetailsRequestForEverything2 request: businessRequestList){ 
        if (request.getStatus()==AsyncTask.Status.RUNNING){ 
         request.cancel(true); 
        } 
       } 
      } 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      try{ 
       String response = service.getResponse(); 
       if (response!=null){ 
       Log.d("fritz", "BusinessIdListRequestForEverything response is "+response); 
        JSONObject jsonObject = new JSONObject(service.getResponse()); 
        JSONObject project = jsonObject.getJSONObject("project"); 
        JSONArray jsonArray = project.getJSONArray("shops"); 
        if (jsonArray.length() > 0) { 
         getBusinessIdListRequestForEverythingCounter=0; 
         getBusinessIdListRequestForEverythingBusinessCount = jsonArray.length(); 
         numberOfBusinessRequests = jsonArray.length(); 
         //clear the businessRequestList 
         businessRequestList.clear(); 
         //increment offset by limit 
         getBusinessIdOffset += getBusinessIdLimit; 
         //empty the businessRequestList 
         for (int x = 0; x < jsonArray.length(); x++) { 
          JSONObject temp = jsonArray.getJSONObject(x); 
          Log.d("fritz", "business id =" + temp.getInt("id")); 
          //getBusiness(temp.getInt("id")); 
          //call getBusiness api 
          MottocoApi projectApi = application.getMottocoApiFactory(); 
          ApiService getBusiness = projectApi.getApi("getBusiness"); 
          getBusiness.addParam("id", String.valueOf(temp.getInt("id"))); 
          BusinessDetailsRequestForEverything2 request = new BusinessDetailsRequestForEverything2(getBusiness); 
          request.execute(); 
          businessRequestList.add(request); 
         } 
        } 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      super.onPostExecute(result); 
     } 
+1

你的代碼在哪裏? – TheFlash

+0

更新了我的問題。 – elL

回答

1

WindowManager$BadTokenException發生。

我不確定在您的AsyncTask.onPreExecute中如何發生這種情況,但肯定會在代碼中出現(暫時)內存泄漏。

我會建議不要使用已棄用的API ActivityGroup與朋友並切換到Fragments

+0

但是當它剛剛啓動時,Activity如何被破壞? – elL

+0

@elL我沒有看到你在'AsyncTask'上調用'execute'的代碼,所以我不知道。這也可能是另一種情況:你的'活動'還沒有創建;) –

+0

哦,我明白了。嗯。我將不得不深入挖掘.. – elL