AsyncTask против MainThread - PullRequest
       14

AsyncTask против MainThread

1 голос
/ 26 февраля 2020

Ну, я написал программу, которая использует inte rnet доступ и делает https запросы. Поэтому мне пришлось использовать AsyncTask для выполнения части запроса. Моя проблема в том, что в моей основной деятельности у меня есть функция, которая увеличивает значение счетчика после каждого запроса https. В моем backgroundTask (это мой класс AsyncTask) я включил целое число c с именем: resultTest, которое нумерует каждое сгенерированное исключение. Я просто хочу передать значение (0/1 или true / false) в зависимости от того, было ли соединение успешным с моим основным потоком. Это значение, которое будет передано, будет определять, следует ли мне увеличивать счетчик или нет.

Вот часть OnPostExecute моего backgroundTask, просто чтобы дать вам представление о том, как она работает:

    @Override
protected void onPostExecute(String result) {
    //this method will be running on UI thread

    pdLoading.dismiss();

    if (resultTest == 0) {
        Toast.makeText(ctx,"Successfully Recorded",Toast.LENGTH_LONG).show();
    }
    else{
        String msg = "";
        switch(resultTest){

            case 1:msg = "Internal App Error";
            case 2:msg="Server Problem";
            case 3:msg="Server Returned Error";
            case 4:msg="Connection Problem";
        }

        Toast.makeText(ctx,msg,Toast.LENGTH_LONG).show();
    }

}

Вот часть моего основного потока, где я создал экземпляр BackgroundTask и событие, которое зависит от возвращаемого значения:

BackgroundTaskWater backgroundTaskWater = new BackgroundTaskWater(getActivity());
backgroundTaskWater.execute(field, val);

// FIX THIS INCREMENT

if(code == 0) {
  meterItemIncrement(meters);
  screen.setText("");
}

Как передать значение переменной resultTest в backgroundTask в переменную код в главном потоке?

Я пытался использовать метод stati c и функцию получения, но не смог. Значение не передается Я даже пытался изменить код переменной в главном потоке на publi c stati c и передал значение из backgroundTask, но когда backgroundTask уничтожается, значение сбрасывается. значение не передается.

Любая идея или предложение будут высоко оценены !!

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

В вашей asyncTask создайте интерфейсный объект и присвойте его в конструкторе:

private OnResultCallBack onResultCallBack;

public BackgroundTaskWater (Context mContext, OnResultCallBack onResultCallBack) {
        this.mContext = mContext;
        this.onResultCallBack= onResultCallBack;
    }

Теперь в onPostExecute () вы обрабатываете сообщение, успешно или нет, и передаете его как параметр в интерфейсе:

if (this.onResultCallBack != null) {
this.onResultCallBack.onSuccess(msg);
}

ПРИМЕЧАНИЕ: вы также должны создать интерфейс с параметром, который вы хотите получить в результате:

   public interface OnResultCallBack{
    void onSuccess(String msg);
}

при создании объекта вашей asyncTask:

BackgroundTaskWater backgroundTaskWater = new BackgroundTaskWater(getActivity(), new OnResultCallback() {
            @Override
            public void onSuccess(String msg) {
                // HERE YOU WILL GET YOU MESSAGE!! (AS IN MAIN THREAD)
                // IF YOU WANT STATUS CODE HERE, ADD SECOND PARAMETER IN interface  
            }
        });
backgroundTaskWater.execute(field, val);
1 голос
/ 26 февраля 2020

Не можете ли вы переместить этот код

if(code == 0) {
  meterItemIncrement(meters);
  screen.setText("");
}

в метод onPostExecute?

...