Как да отхвърлите 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, така че трябва да се отърва от onDestroymethod?   -  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 Statement, за да се справите с всяко от условията. Ако "интернет грешка", тогава pd.dismiss() и направете тост.

За работеща версия на кода можете да се обърнете към тук...

person Phillip Dunley    schedule 28.11.2014