2012-11-01 2 views
0

내 웹 응용 프로그램에서 비동기 작업을 사용하여 안정적인 웹 서비스를 사용하여 웹 서비스에서 응답을 얻고 있습니까? 모든 일이 진행 대화 상자를 사용하지 않고 잘 작동이 코드 내 코드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

아무런 예외가 없습니다. 그냥 null로 반응을 얻고 진행 대화 상자가 해제됩니다. – Androholic

+0

logcat의 오류가 "버퍼 오류 : 결과 변환 오류 java.lang.NullPointerException" – Androholic

답변

1

당신이 당신의 doInBackground() 방법에 어댑터입니다 업데이트중인되는이

  @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

이 코드를 사용하는 경우 android.view.windowmanagerbadtokenexception : 창을 추가 할 수 없습니다 - 토큰 null은 응용 프로그램 예외가 아닙니다. – Androholic

+0

@Androholic이 오류가 발생하도록 실행 상태가 아닌 활동 컨텍스트를 얻습니다. 이 코드는 완벽하게 작동합니다. –

+0

내 활동이 실행 중 상태가 아닌 것으로 어떻게 생각할 수 있습니까? 비동기 작업은 기본 스레드를 방해하지 않으며 동시에 백그라운드 작업을 수행한다는 것을 의미하기 때문입니다. 그러나 주 스레드는 그 상태를 멈추지 않을 것이다. – Androholic

0

시도

 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 관련 작업을 수행하면됩니다. stuff in the onPostExecute()

+0

'progress dialog'가 보이는지'mProgressDialog.isShowing()' – Anuj

+0

이냐고 문제가 progress 대화 상자의 가시성이 아니라면 특별히 확인합니다. 왜 내 결과 (서버 응답) null로 변환 알고 싶습니다. – Androholic

0

, 시도이 하나를이

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

그게 내 질문에 쓴거야. 이것의 변화는 무엇입니까? – Androholic

+0

잘 작동합니다. nullpointerexception이 발생하는 행을 가져올 수 있습니까? – Raghunandan

+0

예외가 없습니다. 그냥 null로 반응을 얻고 진행 대화 상자가 해제됩니다. logcat의 에러는 "버퍼 에러 : 결과 변환 에러 java.lang.NullPointerException"입니다. – Androholic

1

확인하는 이유를 시도하지 않고

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

Anuj와 동의하십시오. – Raghunandan

+0

@Anuj 테스트 중이며 다시 연락을드립니다. – Androholic

+0

@Androholic 물론 우리에게 알려주십시오. – Anuj