Как закрыть ProgressDialog в Volley и обработка ошибок подключения к Интернету

Я пытаюсь создать этот проект Volley в качестве своего второго действия, которое извлекает канал JSON из Yahoo Pipe и отображает в ListView из здесь. Код работает отлично. Тем не менее, я столкнулся с этими проблемами:

Когда я не включил интернет, в активности отображается загрузка ProgressDialog. Однако нажатие кнопки «Назад» на моем эмуляторе или реальном устройстве не закрывает ProgressDialog. Действие не ответило на действие «Назад».

Я попробовал этот код, но он не работает, или, возможно, я делаю это неправильно:

@Override
public void onDestroy() {
    super.onDestroy();
    dismissPd();
}

private void dismissPd() {
    if (pd != null) {
        pd.dismiss();
        pd = null;
    }
}

В случае ошибки подключения к Интернету, как отобразить сообщение об ошибке в этом действии в виде всплывающего уведомления?

Ниже приведен мой код:

public class Trending extends ActionBarActivity {
    private String TAG = this.getClass().getSimpleName();
    private ListView lstView;
    private RequestQueue mRequestQueue;
    private ArrayList<NewsModel> arrNews ;
    private LayoutInflater lf;
    private VolleyAdapter va;
    private ProgressDialog pd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.trending);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        Intent newActivity3=new Intent();
        setResult(RESULT_OK, newActivity3);
        lf = LayoutInflater.from(this);
        arrNews = new ArrayList<NewsModel>();
        va = new VolleyAdapter();
        lstView = (ListView) findViewById(R.id.listView);
        lstView.setAdapter(va);
        mRequestQueue =  Volley.newRequestQueue(this);
        String url = "http://pipes.yahooapis.com/pipes/pipe.run?_id=giWz8Vc33BG6rQEQo_NLYQ&_render=json";
        pd = ProgressDialog.show(this,"Loading...","Please Wait...");
        try {
            Thread.sleep(2000);
        } catch(Exception e) {

    }
    JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.i(TAG,response.toString());
            parseJSON(response);
            va.notifyDataSetChanged();
            pd.dismiss();
        }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.i(TAG,error.getMessage());
            }
        });
        mRequestQueue.add(jr);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        dismissPd();
    }
    private void dismissPd() {
        if (pd != null) {
            pd.dismiss();
            pd = null;
        }
    }
    private void parseJSON(JSONObject json){
        try {
            JSONObject value = json.getJSONObject("value");
            JSONArray items = value.getJSONArray("items");
            for (int i=0; i<items.length(); i++) {
                JSONObject item = items.getJSONObject(i);
                NewsModel nm = new NewsModel();
                nm.setTitle(item.optString("title"));
                nm.setDescription(item.optString("description"));
                nm.setLink(item.optString("link"));
                nm.setPubDate(item.optString("pubDate"));
                arrNews.add(nm);
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    class NewsModel {
        private String title;
        private String link;
        private String description;
        private String pubDate;
        void setTitle(String title) {
            this.title = title;
        }
        void setLink(String link) {
            this.link = link;
        }
        void setDescription(String description) {
            this.description = description;
        }
        void setPubDate(String pubDate) {
            this.pubDate = pubDate;
        }
        String getLink() {
            return link;
        }
        String getDescription() {
            return description;
        }
        String getPubDate() {
            return pubDate;
        }
        String getTitle() {
            return title;
        }
    }
    class VolleyAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return arrNews.size();
        }
        @Override
        public Object getItem(int i) {
            return arrNews.get(i);
        }
        @Override
        public long getItemId(int i) {
            return 0;
        }
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
           ViewHolder vh;
           if (view == null) {
               vh = new ViewHolder();
               view = lf.inflate(R.layout.row_listview,null);
               vh.tvTitle = (TextView) view.findViewById(R.id.txtTitle);
               vh.tvDesc = (TextView) view.findViewById(R.id.txtDesc);
               vh.tvDate = (TextView) view.findViewById(R.id.txtDate);
               view.setTag(vh);
           } else {
               vh = (ViewHolder) view.getTag();
           }    
           NewsModel nm = arrNews.get(i);
           vh.tvTitle.setText(nm.getTitle());
           vh.tvDesc.setText(nm.getDescription());
           vh.tvDate.setText(nm.getPubDate());
           return view;
        }
        class  ViewHolder {
            TextView tvTitle;
            TextView tvDesc;
            TextView tvDate;
        }
    }
}

person Steve Kamau    schedule 28.11.2014    source источник
comment
я использую mProgressDialog.dismiss(); при перехвате или в onPostExecute, если используется asyncTask   -  person Andres Cárdenas    schedule 28.11.2014
comment
@AndresCardenasPardo, значит, мне следует избавиться от метода onDestroy?   -  person Steve Kamau    schedule 28.11.2014


Ответы (2)


попробуйте этот, тогда кнопка «Назад» работает во время работы диалога

pd = ProgressDialog.show(this,"Loading...","Please Wait...");
pd.setCancelable(true);

Используя asynctask, вы пишете код таким образом

@Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        pd = ProgressDialog.show(ctx, null, "fetching ...");
        pd.setCancelable(true);
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // TODO Auto-generated method stub
        try {
       //fetch response from internet and process here


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        pd.cancel();
      //do next action here

        super.onPostExecute(result);
    }
person Venky G    schedule 28.11.2014

Вы должны выполнить часть кода JSON в AsyncTask.

Определите doInBackground для возврата типа String. Из doInBackground обработайте ошибки, такие как интернет-ошибка или ошибка json, и, соответственно, верните подходящее сообщение об ошибке «интернет-ошибка» или «ошибка json».

Эта ошибка будет доступна в качестве входных данных для onPostExecute (результаты). В onPostExecute вы можете запустить оператор Switch для обработки каждого из условий. Если «интернет-ошибка», то pd.dismiss() и сделайте тост.

За рабочей версией кода вы можете обратиться по адресу здесь...

person Phillip Dunley    schedule 28.11.2014