OK Я, должно быть, что-то пропустил здесь, и я не вижу, чтобы на нем был палец. Вот моя ситуация, я создаю свой внешний вид AsyncTask (хорошая практика и многоразовая), у меня нет проблем с подключением к серверу, получением ответа на мой интерфейс с onPostExecute() ;, но с использованием значения из интерфейса в класс Calling и сохранение этой ценности дает мне проблему. Вот пример моего кода.AsyncTask onPostExecute с интерфейсом
Интерфейс
interface getData {
void done (ArrayList<String> returnedData);
}
AsyncTask и вызова метода с помощью класса-оболочки под названием serverRequests
public void getDataInBackground (String params, getData retData){
new getDataAsync(params,retData).execute();
}
public class getDataAsync extends AsyncTask<Void,Void,ArrayList<String>> {
String params;
getData retData;
public getDataAsync(String params, getData retData){
this.params=params;
this.retData=retData;
}
@Override
protected ArrayList<String> doInBackground(Void... params) {
ArrayList<String> list = new ArrayList<>();
//Do a bunch of stuff that connects to my server
return list;
}
@Override
protected void onPostExecute(ArrayList<String> returnedData) {
retData.done(returnedData);
super.onPostExecute(returnedData);
}
}
Тогда моя активность класса, который называет этот процесс будет вот так.
public class MyActivity extends AppCompatActivity {
ServerRequests serverRequests; // the Wrapper class to call my different AsyncTasks
ArrayList<String> someList;
String params="some kind of params";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_activity);
serverRequests= new serverRequests(this);//this being the context passed
someList=new ArrayList<>();
serverRequests.getDataInBackground(params, new getData() {
@Override
public void done(ArrayList<String> returnedData) {
someList.addAll(returnedData);
//somelist has data here
//used AlertDialogs to confirm data
}
});
//someList is empty here and data is needed to perform other tasks.
// again used AlertDialogs to confirm data
В настоящее время я выполняю несколько других сборок AsyncTasks для конечного пользователя. Другие данные задачи зависят от этого первого вызова. Я подумал о временном хранении данных на телефоне, а затем подумал о моей жене, чей телефон всегда ограничен в пространстве памяти, что может вызвать нежелательную ошибку. Я думал о выполнении другой AsyncTask внутри этого, но тогда я бы разворачивал несколько потоков без необходимости и тратил процессор на телефон. Я пробовал другие предложения, которые я нашел на этом сайте, например, сделать static/final someList, но это тоже не работает. Я также попробовал просто простое назначение someList = returnData. Итак, любые предложения о том, как получить это значение от AsyncTask и в вызывающем методе?
хорошо это первый из 5 задач, которые будут использоваться результаты первого в следующем, чтобы создать пользовательский ArrayAdatper с фрагментированным макетом ListView. Итак, запустить 5 вложенных потоков приемлемо для android? Я имею в виду, если бы ваш facebook не думал, что мы сможем сгореть чей-то карман, нагрев телефон. – jmodine
Если вы хотите подключиться к сетевым запросам, вы все равно не будете сжигать CPU - вы будете блокировать IO.Если бы я был вами, я был бы больше обеспокоен тем, что он так долго должен был получить результат, чем я использовал бы процессор. Считаете ли вы создание более мощного API, который может выполнять большую часть работы на сервере, чтобы сократить его до 1-2 вызовов? –
Я думал о том, что, вероятно, так мне нужно идти, если я не могу получить значение вне onPostExetute. Я боюсь, что это означает, что день работы воссоздает webInterface, а затем воссоздает Custom Adapter. Таким образом, вы не знаете, как получить это значение для вызывающего класса, не используя поток пользовательского интерфейса, который другие предложили? – jmodine