У меня есть класс AsyncTask, который работал хорошо, но в этом классе у меня есть ProgressDialog в onPreExecute, который работал нормально, но мне нужно, чтобы, когда я заканчиваю процесс, processdialog закрывается, я помещаю код в onPostExecute следующим образом:

protected void onPostExecute() {
    progress.dismiss();
}

Но это ничего не дает. Диалог не закрывается. Это весь код:

public class JsonRequest extends AsyncTask<String, Void, ArrayList<String>> {

private final Context context;
private ArrayList<String> stringArray = new ArrayList<String>();
private ProgressDialog progress;

public JsonRequest(Context c){
    this.context = c;
}

protected void onPreExecute(){
    progress= new ProgressDialog(this.context);
    progress.setMessage("Loading");
    progress.show();
}

@Override
protected ArrayList<String> doInBackground(String... params) {
    try {

        final String POST_PARAMS = params[1];

        URL obj = new URL(params[0]);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", "Mozilla/5.0");

        // For POST only - START
        con.setDoOutput(true);
        OutputStream os = con.getOutputStream();
        os.write(POST_PARAMS.getBytes());
        os.flush();
        os.close();
        // For POST only - END

        int responseCode = con.getResponseCode();
        System.out.println("POST Response Code :: " + responseCode);

        if (responseCode == HttpURLConnection.HTTP_OK) { //success
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    con.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            JSONArray myListsAll= new JSONArray(response.toString());
            for(int i=0;i<myListsAll.length();i++){

                JSONObject jsonObject = myListsAll.getJSONObject(i);
                this.stringArray.add(jsonObject.toString());
            }

        } else {
            System.out.println("POST request not worked");
        }


    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return this.stringArray;
}

protected void onPostExecute() {
    progress.dismiss();
}

Поэтому я звоню:

public class MyActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
    private void createListView() {
        itens = new ArrayList<ItemFeedsListView>();

        String[] itensUrl = {"url","data"};
        JsonRequest task = new JsonRequest(this);
        try {
            ArrayList<String> result = task.execute(itensUrl).get();

            for(int i = 0 ; i < result.size() ; i++) {
                String currentList = result.get(i);
                JSONObject jsonobject = new JSONObject(currentList);

                ItemFeedsListView item = new ItemFeedsListView(jsonobject.optString("value1"),jsonobject.optString("value2"),jsonobject.optString("valeu3"),jsonobject.optString("value4"),jsonobject.optString("value5"), R.mipmap.eu, R.mipmap.logo);
                itens.add(item);

            }

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

        //Cria o adapter
        adapterListView = new AdapterFeedsListView(this, itens);

        //Define o Adapter
        listView.setAdapter(adapterListView);
        //Cor quando a lista é selecionada para ralagem.
        listView.setCacheColorHint(Color.TRANSPARENT);
    }
}
1
Alexandre C. do Carmo 25 Фев 2016 в 23:17

3 ответа

Лучший ответ

Вы не вызываете право onPostExecute:

Тебе нужно:

@Override
 protected void onPostExecute(ArrayList<String> data) {
    super.onPostExecute(data);
    progress.dismiss();
}

Проблема в том, что вы не переопределяете метод в классе AsyncTask, просто добавляя onPostExecute (). вам нужно добавить аннотацию @Override и передать тип возвращаемого значения вашего класса AsyncTask.

Удачи и удачного программирования!

2
kandroidj 28 Фев 2016 в 07:23

Вы неправильно используете AsyncTask. Взгляните на эту строку кода:

ArrayList<String> result = task.execute(itensUrl).get();

Это запускает AsyncTask (который обычно выполняет большую часть своей работы в фоновом потоке), а затем немедленно блокирует основной поток для получения результата с помощью метода get (). С таким же успехом вы можете даже не использовать AsyncTask в этом случае, потому что цель AsyncTask - освободить основной поток от необходимости выполнять длительные операции.

Вместо этого вы должны действовать только на основе работы, выполненной из фонового потока в вашем onPostExecute ().

1
Doug Stevenson 25 Фев 2016 в 20:46

Вы также можете настроить видимость следующим образом:

@Override
 protected void onPostExecute(ArrayList<String> data) {
    super.onPostExecute(data);
    progress.setVisibility(View.GONE);
}
0
Faisal Shaikh 28 Фев 2016 в 07:33