Суть вопроса в том, что есть 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
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 треде.
Комментариев нет:
Отправить комментарий