繁体   English   中英

AsyncTask中的进度对话框有什么问题

[英]What is wrong with progress dialog in AsyncTask

我在我的应用程序中使用Async Task来使用静态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();

}

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

使用此代码,一切都可以正常工作,而无需使用进度对话框。 如果找到,与进度对话框相关的代码将在上述类中注释。 如果我取消注释进度对话框代码,则不会从服务器得到任何响应。 我也尝试过调试,但是从不知道要消除此错误。 有人可以告诉我这里做错了什么。

好的原因是您正在更新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()

尝试这个

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

试试这个,而不是

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

尝试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM