У меня эта настройка работала, когда у меня просто была активность, но теперь, когда я пытаюсь использовать ее во фрагменте, я немного запутался, я не уверен, нужно ли мне реализовать интерфейс и переопределить методы во фрагменте или оставить его в активность и каким-то образом передать данные фрагмент из деятельности.

< Сильный > Интерфейс

    public interface TaskListener{
    void onTaskFinish(String m);
}

< Сильный > AsyncTask

public class MyAsyncTask extends AsyncTask<Void, Void, Integer>{
private TaskListener taskListener;
Activity activity;
int type;
String gid;
int result = -1;
String gameName;

public DatabaseOperations(int type, Activity activity, String gid){
    this.type = type;
    this.activity = activity;
    this.gid = gid;
}

@Override
protected Integer doInBackground(Void... params){
    if(type == 1){
        gameName = getGameName(gid);
        result = 1;
    }
    if(type ==2){
        //other database function
        result = 2;
    }
    return result;
}

@Override
protected void onPostExecute(Integer result){
    if(result == 1){
        taskListener.onTaskFinish(gameName);        
    }
    if(result ==2){
        //other return
    }

    super.onPostExecute(s);
}

public String getGameName(String gameId){
    //insert database function here
}

}
0
vpgr 24 Апр 2017 в 16:56

2 ответа

Лучший ответ

Нет четких указаний по этому вопросу, но, как правило, я считаю, что более распространенным (и более безопасным) является взаимодействие Деятельности с вашей «службой» (AsyncTask), а затем передача результата Фрагменту.

Для связи с фрагментом вы можете либо реализовать интерфейсы в Activity и Fragment, которые определяют, как они взаимодействуют, либо использовать шину сообщений.

Кроме того, имейте в виду, что, несмотря на то, что AsyncTask находится в API и показан во многих примерах, у него есть некоторые неочевидные, нетривиальные проблемы, и я лично рекомендую полностью избегать их. Если вы не проделаете большую работу самостоятельно, ваша AsyncTask не будет синхронизирована с жизненным циклом Activity. Например, что произойдет, если пользователь повернет устройство или перейдет к другой активности, пока ваша AsyncTask все еще находится в своем методе doInBackground?

Лично я предпочитаю использовать RxJava для обработки фоновых задач, но есть и другие решения этой проблемы.

0
GreyBeardedGeek 24 Апр 2017 в 14:15

Внутри AsyncTask:

public TaskListener delegate = null;

.......

@Override
    protected void onPostExecute(String result) {
        progressDialog.dismiss();

        delegate.onTaskFinish(result);

    }

Внутренний фрагмент .

    public class YourFragment implements TaskListener
    {

    .......

    //execute as per your requirement
    MyAsyncTask myAsyncTask = new MyAsyncTask (type, activity, gid);
         myAsyncTask.delegate = (AsyncResponse) this;
         myAsyncTask.execute();

    ......

    //implement method

     @Override
        public void onTaskFinish(String output) {
            parseResult(output);
        }

}
0
Kuldeep Kulkarni 24 Апр 2017 в 14:14