Показывать индикатор выполнения в асинхронной задаче в Android

#android #android-asynctask

#Android #android-asynctask

Вопрос:

Я хочу показать индикатор выполнения в асинхронной задаче onPreExecute() . Но я не могу передать context . Может ли кто-нибудь помочь?

 public class myClass extends AsyncTask<Void,Void,Void>{
    Context ctx;
    ProgressDialog d;
    String s;


    public myClass (String S, Context con) {
        this.ctx = con;
        this.s = S;
    }


    @Override
        protected void onPreExecute() {
            d = new ProgressDialog(this.ctx);
            d.setMessage("Please wait...");
            d.setIndeterminate(true);
            d.show();
        }
 

Вызов из основного действия как

  new myClass(MainActivity.this);
 myClassObj.execute(s);
 

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

1. для этого вы можете использовать метод getApplicationContext()

2. использовать конструктор

3. @RahulKhurana где я должен его использовать?

4. новый ProgressDialog(getApplicationContext()); попробуйте это

5. myclassу нужны два параметра, и вы отправляете только 1. Это должен быть новый MyClass(yourString ,MainActivity.this)

Ответ №1:

Это должно быть так, переходя в конструктор.

 public class myClass extends AsyncTask<Void,Void,Void>{
    private ProgressDialog dialog;
    private String paramOne;
    private int paramTwo;

    public myClass (Activity activity, String paramOne, int paramTwo) {
       dialog = new ProgressDialog(activity);
       this.paramOne = paramOne; // "Hello"
       this.paramTwo = paramTwo; // 123
    }

    @Override
    protected void onPreExecute() {
       dialog.setMessage("Please wait...");
       dialog.setIndeterminate(true);
       dialog.show();
    }
 

Назовите это так.

 new myClass(YourActivity.this, "Hello!", 123).execute();
 

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

1. new myClassObj(MainActivity.this).execute(); не работает.

2. не работает. Смотрите мой обновленный вопрос. Я также хочу отправить параметр в асинхронный класс. Также покажите код приема в классе async.

3. Не работает. new myClass(MainActivity.this); , MainActivity.this красный. Выдает ошибку. Cannot be applied.

4. Обновите свой вопрос и опубликуйте свой код о том, как вы вызываете эту асинхронную задачу.

5. Вы понимаете, что называете это неправильно, верно? Это должно быть new myClass(MainActivity.this).execute();

Ответ №2:

У меня есть лучший подход к этому, используйте индикатор выполнения в своей деятельности или фрагменте, и как только вы запустите свою asynctask, установите видимость на ВИДИМУЮ, а когда вы получите результат в postExecute, установите видимость, используя интерфейс в activity. Что-то вроде этого

 /**
     * Listener for listening events happening in background task, whether cancelled or completed
     * with error or success.
     */
    public interface Listener {
        /**
         * Callback invoked when request is completed and response is got with
         * code == {@value java.net.HttpURLConnection#HTTP_OK}.
         */
        void onSuccess(Response response);

        /**
         * Callback invoked when request is cancelled or completed with response
         * code != {@value java.net.HttpURLConnection#HTTP_OK}.
         */
        void onError(Response response);
    }
 

и в вашей деятельности

    void onSuccess(Response response){
       //Visibility to Gone.
   }
 

Ответ №3:

Будет два случая вызова AsyncTask При вызове AsyncTask в одном и том же действии:-

 public class myClass extends AsyncTask<Void,Void,Void>{
ProgressDialog d;
String s;

public myClass (String str) {
    this.s= str;
}
@Override
    protected void onPreExecute() {
        d = new ProgressDialog(getApplicatinContext());
        d.setMessage("Please wait...");
        d.setIndeterminate(true);
        d.show();
    }
 

Вызов из основного действия как

 myClassObj.execute();
 

Если вам нужно вызвать отдельное действие или отдельный файл, тогда вам нужно следовать приведенному ниже коду:-

 public class myClass extends AsyncTask<Void,Void,Void>{
    Activity act;
    ProgressDialog d;


public myClass (Activity act) {
    this.act = act;
}


@Override
    protected void onPreExecute() {
        d = new ProgressDialog(act.getApplicationContext());
        d.setMessage("Please wait...");
        d.setIndeterminate(true);
        d.show();
    }
 

Вызов из основного действия как

 new myClass(MainActivity.this);
myClassObj.execute(s);
 

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

1. Смотрите мой обновленный вопрос. Я хочу отправить параметр в асинхронные классы.