0

アプリケーションで非同期タスクを使用して、安静な Web サービスを使用して Web サービスから応答を取得しています。私のコード

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

    new JSONParserTask().execute();

}

非同期タスク クラス

    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();
    }      
   }

このコードでは、進行状況ダイアログを使用せずにすべてが正常に機能します。見つかった場合は、進行状況ダイアログに関連するコードが上記のクラスにコメントされています。進行状況ダイアログ コードのコメントを外すと、サーバーからの応答が得られません。デバッグも試しましたが、このエラーを取り除く方法はわかりません。ここで何が間違っているのか誰かが教えてくれますか?

4

4 に答える 4

1

その理由は、あなたがあなたの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 });

このコードはメイン スレッドに関連しているため、バックグラウンド スレッドでここで呼び出すべきではありません。ここから削除して に追加しonPostExecute()、バックグラウンド スレッドから配列リストを渡して、他の UI 関連をonPostExecute()

于 2012-11-01T12:27:07.383 に答える
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();
       }
}
于 2012-11-01T12:15:16.233 に答える
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();
           }
于 2012-11-01T12:15:51.693 に答える
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();
           }
}
于 2012-11-01T12:11:11.270 に答える