У меня эта настройка работала, когда у меня просто была активность, но теперь, когда я пытаюсь использовать ее во фрагменте, я немного запутался, я не уверен, нужно ли мне реализовать интерфейс и переопределить методы во фрагменте или оставить его в активность и каким-то образом передать данные фрагмент из деятельности.
< Сильный > Интерфейс
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
}
}
2 ответа
Нет четких указаний по этому вопросу, но, как правило, я считаю, что более распространенным (и более безопасным) является взаимодействие Деятельности с вашей «службой» (AsyncTask), а затем передача результата Фрагменту.
Для связи с фрагментом вы можете либо реализовать интерфейсы в Activity и Fragment, которые определяют, как они взаимодействуют, либо использовать шину сообщений.
Кроме того, имейте в виду, что, несмотря на то, что AsyncTask находится в API и показан во многих примерах, у него есть некоторые неочевидные, нетривиальные проблемы, и я лично рекомендую полностью избегать их. Если вы не проделаете большую работу самостоятельно, ваша AsyncTask не будет синхронизирована с жизненным циклом Activity. Например, что произойдет, если пользователь повернет устройство или перейдет к другой активности, пока ваша AsyncTask все еще находится в своем методе doInBackground?
Лично я предпочитаю использовать RxJava для обработки фоновых задач, но есть и другие решения этой проблемы.
Внутри 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);
}
}
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].