Показать диалоги с асинхронной задачей в Android - PullRequest
0 голосов
/ 18 октября 2019

Я хочу показать диалоговое окно, когда асинхронная задача начинает загружать контент из Интернета в методе onPreExecute, и удалить диалоговое окно, когда загрузка была завершена в методе onPostExecute,

    public class ListNumbers extends AppCompatActivity {

    private ListView lView;
    private NumberAdapter mNumAdapt;
    public List<String> numes;
    private ArrayList<Phonesnum> numbersList;

    public AsyncTask<Void,Void,Void> mTask;
    private String json_string;

    private String url="the url where to download content";

    public class DownloadLink extends AsyncTask<String,Void,String>{

        @Override
        protected String doInBackground(String... strings) {
            Log.i("URL",strings[0]);

            StringBuilder res = new StringBuilder("");

            URL ur;
            HttpURLConnection urlConnection = null;

            try{
                ur = new URL(strings[0]);

                urlConnection = (HttpURLConnection)ur.openConnection();

                InputStream in = urlConnection.getInputStream();

                InputStreamReader reader = new InputStreamReader(in);

                int data = reader.read();

                while (data != -1){
                    char current = (char)data;

                    res.append(current);

                    data = reader.read();
                }

                return res.toString();

            }catch (Exception e){
                e.printStackTrace();
                return  "failed";
            }

        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            Handler h = new Handler(Looper.getMainLooper());
            h.post(new Runnable() {
                @Override
                public void run() {
                    LayoutInflater inflater = (LayoutInflater)
                            getSystemService(LAYOUT_INFLATER_SERVICE);
                    View popupView = inflater.inflate(R.layout.popup_layout, null);

                    // create the popup window
                    int width = LinearLayout.LayoutParams.WRAP_CONTENT;
                    int height = LinearLayout.LayoutParams.WRAP_CONTENT;
                    final PopupWindow popupWindow = new PopupWindow(popupView, width, height, false);

                    // show the popup window
                    // which view you pass in doesn't matter, it is only used for the window tolken
                    popupWindow.showAtLocation(popupView, Gravity.CENTER, 0, 0);
                }
            });
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            try {
                //JSONObject jObject = new JSONObject(s);

                //String weatherInfo = jObject.getString("number");


                //Log.i("number",weatherInfo);

                JSONArray arr = new JSONArray(s);

                for (int i =0;i < arr.length(); i++){
                    JSONObject jpart = arr.getJSONObject(i);

                    String number = jpart.getString("number");
                    //numes.add(number);

                    String prc = jpart.getString("price");

                    numbersList.add(new Phonesnum(number,prc));
                }

                //ArrayAdapter<String> arad = new ArrayAdapter<String>(ListNumbers.this,android.R.layout.simple_list_item_1,numes);
                NumberAdapter nmAdapter = new NumberAdapter(ListNumbers.this,numbersList);
                lView.setAdapter(nmAdapter);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_numbers);
        getSupportActionBar().setElevation(0);
        getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        getSupportActionBar().setCustomView(R.layout.title_bar);

        numes = new ArrayList<>();
        numbersList = new ArrayList<>();

        lView = (ListView)findViewById(R.id.list_ve);

        if (numes.size() == 0){

        }
        new Thread(new Getnumbers()).start();
    }

    class Getnumbers implements Runnable{

        @Override
        public void run() {
            String result = null;
            DownloadLink task = new DownloadLink();
            try {

                result = task.execute(url).get();
                Log.i("result",result);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

здесь я поместил всплывающее окно в зависимости отпредыдущий вопрос здесь на веб-сайте .. но я не могу контролировать, когда показывать или скрывать всплывающее окно, потому что всплывающее окно создано в обработчике, и я не могу получить к нему доступ из метода onPostExecute .... я попытался и создал индикатор выполнения сраньше в глобальном разделе, затем я попытался получить к нему доступ из потока GetNumber, но он показал мне ошибку, потому что вы должны создать панель progess и накачать макет из основного потока

...