Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Как многократно можно обращаться к выполнению AsyncTask

Суть вопроса в том, что есть AsyncTask в котором я получаю JSON с сайта, и передаю выборку в MainActivity. Первое обращение к AsyncTask создается при запуске программы. Также в форме есть кнопка обновить данные, при нажатии которой я хочу повторно обновить данные с сайта обратившись к AsyncTask, но получаю сообщение что он уже выполняется и может быть выполнен только один раз.
Прошу помощи в решении задачи. Также если есть предложение по изменению AsyncTask на другое решение тоже буду рад. :)
- Публикую код -
MainActivity.java
public class MainActivity extends AppCompatActivity implements AsyncResponse{
Button click; public static TextView data; GetDataFromSite asyncTask = new GetDataFromSite(); String str = "";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
click = (Button) findViewById(R.id.button); data = (TextView) findViewById(R.id.fachetdata);
ReadJSONDataFromFile();
asyncTask.delegate = this; asyncTask.execute();
click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { asyncTask.execute(); } }); }
@Override public void processFinish(String JSON_Write_Data){ WriteJSONDataToFile(JSON_Write_Data); ReadJSONDataFromFile(); }
void WriteJSONDataToFile(String JSONDW) { try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(openFileOutput("nano_data.json", MODE_PRIVATE))); bw.write(JSONDW); bw.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
void ReadJSONDataFromFile() { try { BufferedReader br = new BufferedReader(new InputStreamReader(openFileInput("nano_data.json"))); while ((str = br.readLine()) != null) { data.setText(str); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
}

GetDataFromSite.java
public class GetDataFromSite extends AsyncTask { ... Тут переменные ... public AsyncResponse delegate = null; @Override protected Void doInBackground(Void... voids) {
try { ... Тут качаем JSON данные с сайта и пишем их в переменную Full_Info которая передается в MainActivity и пишеться в фаил в WriteJSONDataToFile ... } catch (IOException e1) { e1.printStackTrace(); } catch (JSONException e1) { e1.printStackTrace(); }
return null; }
@Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); MainActivity.data.setText(this.Full_Info); delegate.processFinish(this.Full_Info); } }

Ну и интерфейс AsyncResponse.java
public interface AsyncResponse { void processFinish(String JSON_Write_Data); }


Ответ

Если исправлять в лоб, без рефакторинга, который тут не помешал бы, то вот так:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
click = (Button) findViewById(R.id.button); data = (TextView) findViewById(R.id.fachetdata);
ReadJSONDataFromFile();
startAsyncTask();
click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startAsyncTask(); } }); }
private void startAsyncTask() { GetDataFromSite asyncTask = new GetDataFromSite(); asyncTask.delegate = this; asyncTask.execute(); }
Должно работать при условии, что delegate будет вызываться в UI треде.

Комментариев нет:

Отправить комментарий