Для роботы AsyncTask нужно нажать два раза на кнопку
должен запускаться при нажатии на кнопку. Но для того чтобы он сработал, при запуске программы первый раз, нужно два раза нажать кнопку. Как это исправить?
public class MainActivity extends AppCompatActivity {
private EditText editTextCity;
private EditText editTextNumber;
private Spinner spinnerCounties;
private static boolean doesExist;
private static int NumberOfDays;
private static String city;
private static int id;
private static String number;
private static ArrayList<WeatherDay> weatherDays;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextCity = findViewById(R.id.editTextCity);
editTextNumber=findViewById(R.id.editTextNumber);
spinnerCounties=findViewById(R.id.spinner);
}
public void onClickCheckWeather(View view) throws ExecutionException, InterruptedException {
city = editTextCity.getText().toString().trim();
id =spinnerCounties.getSelectedItemPosition();
number=editTextNumber.getText().toString();
if (!city.isEmpty()&& !number.isEmpty()&&(Integer.parseInt(number)>0 && Integer.parseInt(number)<17)) {
NumberOfDays=Integer.parseInt(editTextNumber.getText().toString());
String[] countries={"None","AT","AR","BR","CA","CN","HR","CZ","EG","FR","DE","GR","IT","JP","MX","ME","NL","PL","PT","RU","ES","UA","UK","US"};
String country=countries[id];
String query="";
if (country=="None") {
query = String.format("https://api.weatherbit.io/v2.0/forecast/daily?city=%s&key=4e2d6343c40d4652b80a70190ff5ac87", city);
} else {
query = String.format("https://api.weatherbit.io/v2.0/forecast/daily?city=%s&country=%s&key=4e2d6343c40d4652b80a70190ff5ac87", city,country);
}
weatherDays=new ArrayList<>();
DownloadTask task = new DownloadTask(this);
task.execute(query);
} else {
Toast.makeText(MainActivity.this, "All fields should be filled correctly", Toast.LENGTH_SHORT).show();
}
}
public static class DownloadTask extends AsyncTask<String, Void, String> {
private Context context;
public DownloadTask(Context context) {
this.context=context;
}
@Override
protected String doInBackground(String... strings) {
StringBuilder result = new StringBuilder();
URL url = null;
HttpURLConnection urlConnection = null;
try {
url = new URL(strings[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
BufferedReader breader = new BufferedReader(reader);
String line = breader.readLine();
while (line != null) {
result.append(line);
line = breader.readLine();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
return result.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
try {
StringBuilder builder=new StringBuilder();
JSONObject jsonObject = new JSONObject(s);
JSONArray jsonArray=jsonObject.getJSONArray("data");
for(int i=0;i<NumberOfDays;i++) {
JSONObject object = jsonArray.getJSONObject(i);
String date=object.getString("datetime");
String mintemp = object.getString("min_temp");
String maxtemp=object.getString("max_temp");
String descr=object.getJSONObject("weather").getString("description");
String result = date+",."+mintemp+",."+maxtemp+",."+descr;
WeatherDay weatherDay = new WeatherDay(result);
weatherDays.add(weatherDay);
}
for(WeatherDay weatherDay:weatherDays) {
builder.append(weatherDay);
}
if (weatherDays.isEmpty()) {
doesExist=false;
} else {
doesExist=true;
}
if (!doesExist) {
Toast.makeText(context, "This city does not exist", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(context, Main2Activity.class);
intent.putExtra("city", city);
intent.putExtra("number", number);
intent.putExtra("country", String.valueOf(id));
context.startActivity(intent);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
Ответы (1 шт):
Автор решения: ЮрийСПб
→ Ссылка
Вы неправильно используете AsyncTask и асинхронную задачу вообще.
Оно должно работать так:
- Запустили задачу
- Когда-то она, может быть, выполнится.
- Когда и если она выполнится - исполнить код, требующий результата работы задачи.
Вы же делаете так:
- Запустить задачу.
- Заморозить программу пока задача не исполнится (система вообще предложит приложение прибить через 5с)
- Исполнить код, требующий результата работы программы.
- Выполнить код, устанавливающий результат работы программы.
У вас 2 ошибки:
- Вызов
get()у AsyncTask - так делать нельзя, вы заморозите главный поток - Исполнение кода, требующего результат запроса не в том порядке.
Сделайте так:
- Уберите вызов
get() - Весь код, который зависит от работы задачи перенесите в
onPostxecute()