2012-11-01 68 views
0

在我的應用程序中使用Async Task來使用平靜的Web服務從Web服務獲取響應。我的代碼AsyncTask中的進度對話框有什麼問題

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_json_page); 
    _mContext = this; 

    new JSONParserTask().execute(); 

} 

的AsyncTask類

private class JSONParserTask extends AsyncTask<Void, Void, ListAdapter >{ 


    ProgressDialog dialog; 


    @Override 
    protected void onPreExecute() { 

    // dialog = new ProgressDialog(_mContext); 
    // dialog.setMessage("Loading..."); 
    // dialog.show(); 
     super.onPreExecute(); 

    } 


    @Override 
    protected ListAdapter doInBackground(Void... arg0) { 
     ListAdapter adapter = null; 
     itemsList = new ArrayList<HashMap<String, String>>(); 

      jParser = new JSONParser(); 
     JSONObject json = jParser.getJSONFromUrl(Constants.JsonURL); 

      if(json == null){ 

       Log.v(TAG, "----------- null"); 
       return null; 
      } 


      try { 

       // Getting Array of Items 
       items = json.getJSONArray(TAG_ITEMS);  
       // looping through All items 
       for(int i = 0; i < items.length(); i++) { 
        JSONObject itemsObj = items.getJSONObject(i); 
        JSONObject products = null; 
        products = itemsObj.getJSONObject(TAG_PRODUCT); 
        Log.d(TAG,"product array "+products.toString()); 

        JSONArray images = products.getJSONArray(TAG_IMAGES); 
        JSONObject imagesObj = images.getJSONObject(0); 
        Log.d(TAG, "......."+ imagesObj.getString(TAG_LINK)); 

        String imageUrl = imagesObj.getString(TAG_LINK); 


        // Storing each json item in variable 
        String kind = itemsObj.getString(TAG_KIND); 
        String id = itemsObj.getString(TAG_KID); 
          String selfLink = itemsObj.getString(TAG_SELFLINK); 

          HashMap<String, String> map = new HashMap<String, String>(); 

         // adding each child node to HashMap key => value 
         map.put(TAG_KIND, kind); 
         map.put(TAG_KID, id); 
         map.put(TAG_SELFLINK, selfLink); 

          // adding HashList to ArrayList 
           itemsList.add(map); 

       } 
       /** 
       * Updating parsed JSON data into ListView 
       * */ 
       adapter = new SimpleAdapter(_mContext, itemsList, 
         R.layout.list_item_row, 
         new String[] { TAG_KIND, TAG_SELFLINK }, new int[] { 
           R.id.name, R.id.mobile }); 



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

    @Override 
    protected void onPostExecute(ListAdapter adapter) { 


      lv.setAdapter(adapter);  

      // Launching new screen on Selecting Single ListItem 
      lv.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 
        // some action 
       } 
      }); 

     //dialog.dismiss(); 
    }  
    } 

與此代碼的每一件事情做工精細,而無需使用進度對話框。如果找到了,與進度對話框相關的代碼將在上面的類中進行註釋。 如果我取消註釋進度對話框代碼,我沒有收到服務器的任何響應。我也嘗試過調試,但從來沒有任何想法去除這個錯誤。 有人可以告訴我們在這裏做什麼錯。

+0

請通過logcat在這裏.. –

+0

我沒有得到任何異常。只是得到響應爲空和進度對話框被解僱。 – Androholic

+0

logcat中的錯誤是「緩衝區錯誤:轉換結果java.lang.NullPointerException錯誤」 – Androholic

回答

1

試試這個

ProgressDialog mProgressDialog; 

@Override 
     protected void onPreExecute() { 
      mProgressDialog= ProgressDialog.show(getApplicationContext(),"", getString(R.string.dialog_wait_message)); 
      super.onPreExecute(); 
     } 




    protected void onPostExecute(Void result) { 
       if(mProgressDialog!=null){ 
        mProgressDialog.dismiss(); 
      } 
} 
+0

如果我使用此代碼獲取android.view.windowmanagerbadtokenexception:無法添加窗口 - 標記null不適用於應用程序異常 – Androholic

+0

@Androholic您將獲取未處於運行狀態的活動的上下文,因此您會收到此錯誤。此代碼完美工作。 –

+0

我們如何認爲我的活動不處於運行狀態?因爲異步任務意味着它不會干擾主線程,並且同時執行後臺工作。但主線程不會停止它的狀態。 – Androholic

0

試試這一個,而

ProgressDialog mProgressDialog; 

    @Override 
    protected void onPreExecute() { 
     mProgressDialog= ProgressDialog.show(getApplicationContext(),"", getString(R.string.dialog_wait_message)); 
     super.onPreExecute(); 
    } 

    @Override 
    protected ListAdapter doInBackground(Void... arg0){ 
     //do your stuff here 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
      if(mProgressDialog!=null && mProgressDialog.isShowing()){ 
       mProgressDialog.dismiss(); 
     } 
} 
+0

這個特別檢查'進度對話框是否可見'mProgressDialog.isShowing()' – Anuj

+0

這個問題與進度對話框的可見性無關。我想知道爲什麼我的結果(從服務器響應)轉換爲空。 – Androholic

0

試試這個

  @Override 
    protected void onPreExecute() { 
     pd=new ProgressDialog(m_context); 
     pd.setTitle("Authenticating"); 
     pd.show(); 

    } 
    @Override 
    protected Void doInBackground(Void... args) { 
      //your stuff 
      } 
     @Override 
    protected void onPostExecute(Void result) { 

     pd.dismiss(); 
      } 
+0

這就是我在我的問題中寫的。這有什麼變化? – Androholic

+0

它應該可以正常工作。你能找到發生nullpointerexception的那一行嗎? – Raghunandan

+0

我沒有得到任何異常。只是得到響應爲空和進度對話框被解僱。 logcat中的錯誤是「緩衝區錯誤:轉換結果java.lang.NullPointerException」的錯誤。 – Androholic

1

ok了這個原因是要更新你在你的doInBackground()方法適配器

 adapter = new SimpleAdapter(_mContext, itemsList, 
        R.layout.list_item_row, 
        new String[] { TAG_KIND, TAG_SELFLINK }, new int[] { 
          R.id.name, R.id.mobile }); 

此代碼與MAIN THREAD相關,不應在後臺線程調用此處,從此處將其刪除,並將其添加到onPostExecute(),只需從後臺線程傳遞數組列表並執行其他UI相關東西在onPostExecute()

+0

同意Anuj。 – Raghunandan

+0

@Anuj我正在測試它,並會回覆給你。 – Androholic

+0

@Androholic當然,請讓我們知道。 – Anuj