Показывать ProgressDialog при использовании AsynTask для анализа JSON и заполнения списка

#android #android-asynctask #progressdialog

#Android #android-asynctask #progressdialog

Вопрос:

У меня есть две асинхронные задачи. В первом я извлекаю данные с сервера в форме JSON и преобразую их в строку. Во втором я разбираю строку на объекты.

Все это происходит после того, как пользователь нажимает на кнопку в AlertDialog. Пока это происходит, я хочу показать ProgressDialog. Но в настоящее время AlertDialog отключается после нажатия кнопки, что нормально. но диалоговое окно прогресса не отображается.

Вот мой код:-

 private void PostString(String postedString)
            {
                // TODO Auto-generated method stub

                String postUrl  = EndPoints.PostURL;
                try 
                {
                    String Response = new Post().execute(postUrl).get();
                    String getRequesturl= url
                    String items = new FetchItems().execute(getRequesturl).get();
                    ArrayList<HashMap<String, String>> updatedPostList = new GetList().execute(items).get();
 

}

 private class Post extends AsyncTask<String, String, String>
    {




        @Override
        protected String doInBackground(String... params)
        {
            // TODO Auto-generated method stub

            HttpResponse response =null;
            String resultString = "";
            String myResponseBody = "" ;
            // Creating HTTP client
            HttpClient httpClient = new DefaultHttpClient();
            // Creating HTTP Post
            HttpPost request = new HttpPost(params[0]);

            List<NameValuePair> nameValuePair =nameValuePairs


            try 
            {
                request.setEntity(new UrlEncodedFormEntity(nameValuePair));
                response = httpClient.execute(request);
                if(response.getStatusLine().getStatusCode()== 200)
                {
                    HttpEntity entity = response.getEntity();
                    if (entity != null)
                    {

                        InputStream inputStream = entity.getContent();
                        myResponseBody = convertToString(inputStream);
                    }
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            return myResponseBody;
        }


private class FetchItems extends AsyncTask<String, String, String> 
    {
        // TODO Auto-generated method stub

        @Override
        protected String doInBackground(String... params) 
        {
            // TODO Auto-generated method stub
            HttpResponse response =null;
            String resultString = "";
            String myResponseBody = "" ;
            // Creating HTTP client
            HttpClient httpClient = new DefaultHttpClient();
            // Creating HTTP Post
            HttpGet request = new HttpGet(params[0]);


            try 
            {
                response = httpClient.execute(request);
                if(response.getStatusLine().getStatusCode()== 200)
                {
                    HttpEntity entity = response.getEntity();
                    if (entity != null)
                    {

                        InputStream inputStream = entity.getContent();
                        myResponseBody = convertToString(inputStream);
                    }
                }
            }
            catch(Exception e)
            {
            }
            return myResponseBody;
        }





        @Override
        protected void onPostExecute(String result) 
        {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

            if(pd!=null amp;amp; pd.isShowing())
                pd.dismiss();
        }





        @Override
        protected void onPreExecute() 
        {
            // TODO Auto-generated method stub
            super.onPreExecute();


        }


private class GetList extends AsyncTask<String, String, ArrayList<HashMap<String, String>>>
    {


        @Override
        protected ArrayList<HashMap<String, String>> doInBackground(String... params)
        {
            // TODO Auto-generated method stub
            myCList.clear();
            try {
                JSONObject jsonResponse = new JSONObject(new String(params[0]));
                JSONArray mtUsers = jsonResponse.getJSONArray("ListOfC");
                for (int i = 0; i < mtUsers.length(); i  )
                {
                    JSONObject menuObject = mtUsers.getJSONObject(i);
//Parsing

                    map = new HashMap<String,String>();
                    map.put(My items here)

                    myCommentsList.add(map);

                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Collections.reverse(myList);
            return myList;
        }



    }



case R.id.btnAdd:
            scrollNews.fullScroll(v.FOCUS_DOWN);
            btnAddComms.setPressed(true);

            builder = new AlertDialog.Builder(NewsDetails.this);
            builder.setTitle("Post Comment");
            builder.setIcon(R.drawable.post_comment_button);


            final EditText input1 = new EditText(NewsDetails.this);
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.MATCH_PARENT);

            input1.setLayoutParams(lp);
            builder.setView(input1);


            builder.setPositiveButton("Post", new DialogInterface.OnClickListener()
            {

                public void onClick(DialogInterface dialog, int id) 
                {

                    pd = new ProgressDialog(Details.this);
                    pd.setMessage("Posting..");
                    pd.show();
                    pd.setCancelable(true);

                    postedString= input1.getText().toString();
                    dialog.dismiss();

                    if(postedString.length()>0)
                    {
                        Post(postedString);

                    }
                    else
                    {
                        Toast.makeText(Details.this, "Please enter a text.", Toast.LENGTH_LONG).show();
                        input1.findFocus();
                    }





                }
 

Ответ №1:

Создайте a ProgressDialog в качестве переменной экземпляра.

 pDialog = new ProgressDialog(this);
pDialog.setMessage("Fetching data");
 

внутри метода onPreExecute() AsyncTask :

 pDialog.show();
 

внутри метода onPostExecute() AsnycTask :

 pDialog.dismiss();
 

Примечание 1: вам не нужно несколько асинхронных задач, вы можете выполнить всю выборку и синтаксический анализ только внутри первой асинхронной задачи, поскольку вы вызываете одну асинхронную задачу за другой.

 String Response = new Post().execute(postUrl).get();
String getRequesturl= url;
String items = new FetchItems().execute(getRequesturl).get();
ArrayList<HashMap<String, String>> updatedPostList = new GetList().execute(items).get();
 

Примечание 2: когда вы выполняете AsyncTask.execute.get() в потоке пользовательского интерфейса, ваш пользовательский интерфейс будет заблокирован, что не рекомендуется. Итак, просто вызовите AsyncTask.execute() и покажите диалоговое окно прогресса, пока все происходит в фоновом режиме.

Комментарии:

1. Я выполняю execute.get(), чтобы получить строку и список. как я могу сделать это из самой задачи?

2. и ваш пользовательский интерфейс перестает отвечать на запросы, пока вы ждете результата?

3. кроме того, я думаю, вы можете захотеть показать диалоговое окно выполнения во время выполнения всех ваших асинхронных задач, поэтому просто поместите часть pDialog.dismiss() в ваш последний метод AsyncTask onPostExecute() .