Android Java не может вызвать ASyncTask - PullRequest
0 голосов
/ 21 марта 2019

Я новичок в программировании на android и java, но передо мной была поставлена ​​задача завершить приложение, запущенное подрядчиком. Я посмотрел и нашел, как вызвать задачу ASync и дождаться ее завершения, но не могу заставить ее работать. На самом деле, он даже не скомпилируется. Я скопировал его прямо из одного из ответов в Как получить результат OnPostExecute () для основного действия, потому что AsyncTask - это отдельный класс?

Ошибки, которые я получаю, приведены ниже. Они приходят в класс MyCalling. Я добавил ***** в конец строки с ошибкой

ошибка:

   processFinish(String) in <anonymous 
   com.zoeller.z_controlmobile.MyCallingClass$2> cannot implement 
   processFinish(String) in AsyncResponse
   attempting to assign weaker access privileges; was public

и

   error: incompatible types: AsyncTask<String,String,String> cannot be 
   converted to MyASyncClass

Мой код ниже

public class MyCallingClass extends ActivityBase {
    private String _result = null;

    protected void onCreate(Bundle savedInstanceState) {
        callingMethod();
    }

    protected void callingMethod() {
        MyASyncClass whatever = new MyASyncClass(new MyASyncClass.AsyncResponse() {
            @Override
            void processFinish(String output) { *****
                _result = output;
            }
        }).execute();
    }

    // More work done here
}

public class MyASyncClass extends AsyncTask<String, String, String> {
    public interface AsyncResponse {
        void processFinish(String output);
    }

    public AsyncResponse delegate = null;

    public DeviceConnect(AsyncResponse delegate){
        this.delegate = delegate;
    }

    @Override    
    protected String doInBackground(String... params) {
    // Does the work
    }

    @Override
    public void onPostExecute(String result) {
        delegate.processFinish(result);
    }
}

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Когда вы объявляете интерфейс со следующим кодом:

public class MyASyncClass extends AsyncTask<String, String, String> {

    public interface AsyncResponse {
        void processFinish(String output);
    }

     ...
}

, модификатор доступа из void processFinish(String output) неявно назначается public.Итак, что вы действительно получаете:

public class MyASyncClass extends AsyncTask<String, String, String> {

    public interface AsyncResponse {
        public void processFinish(String output);
    }

    ...
}

Когда вы создаете объект из интерфейса, вам необходимо переопределить как метод, так и модификатор доступа.Примерно так:

MyASyncClass.AsyncResponse response = new MyASyncClass.AsyncResponse() {
        @Override
        public void processFinish(String output) {
           // do something with the output.
        }
    };
0 голосов
/ 21 марта 2019
public class MyCallingClass extends ActivityBase {
private String _result = null;

protected void onCreate(Bundle savedInstanceState) {
    callingMethod();
}

private void callingMethod() {
    MyASyncClass whatever = new MyASyncClass(output -> _result = output);
    whatever.execute();
}
}

class MyASyncClass extends AsyncTask<String, String, String> {
public interface AsyncResponse {
    void processFinish(String output);
}

private AsyncResponse delegate = null;

MyASyncClass(AsyncResponse delegate){
    this.delegate = delegate;
}

@Override
protected String doInBackground(String... params) {
    // Does the work

    return "";
}

@Override
public void onPostExecute(String result) {
    delegate.processFinish(result);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...