Страницы

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

четверг, 30 мая 2019 г.

Как передать результат выполнения асинхронного запроса обратно в вызвавшую его активность?

Есть окно с элементом spinner, который должен заполняться значениями из базы данных MS SQL. Для связи с БД использую jtds 1.2.8 в асинхронных запросах, но никак не выходит найти способ чтобы переправить данные результата запроса в активность, которая послала асинхронный запрос. Как реализовать заполнение spinner после выполнения запроса?
UA.java
public class UA extends AppCompatActivity{
private QueryItem Item = new QueryItem();
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ua); Item.setId(Search_Page.id_intent); Search_Page.id_intent = 0; String[] query = new String[2]; query[1] = "get_dish_links"; query[0] = "EXEC " + query[1] + "" + Item.getId(); new AsyncRequest().execute(query); final SeekBar seekbar = (SeekBar) findViewById(R.id.seekBar); }
public void onClick(View view) { final Spinner spinner = (Spinner)findViewById(R.id.spinner); //Item.setUnit(spinner); }
public void fill_spinner(List links){ final Spinner spinner = (Spinner)findViewById(R.id.spinner); ArrayAdapter possible_units = new ArrayAdapter(this, android.R.layout.simple_list_item_1, links); spinner.setAdapter(possible_units); spinner.setSelection(0); possible_units.notifyDataSetChanged(); }
AsyncRequest.java
public final class AsyncRequest extends AsyncTask {
public final static String MSSQL_DB = "jdbc:jtds:sqlserver://localhost:1433; DatabaseName=Lazycook"; public final static String MSSQL_LOGIN = "lazyuser"; public final static String MSSQL_PASS = "12344321"; public final static JSONConverter conv = new JSONConverter(); public String action;
@Override protected JSONArray doInBackground(String[] query) { JSONArray resultSet = new JSONArray(); action = query[1]; try { Class.forName("net.sourceforge.jtds.jdbc.Driver"); Connection con = null; Statement st = null; ResultSet rs = null; try { con = DriverManager.getConnection(MSSQL_DB, MSSQL_LOGIN, MSSQL_PASS); if (con != null) { st = con.createStatement(); rs = st.executeQuery(query[0]); if (rs != null) { int columnCount = rs.getMetaData().getColumnCount(); // Сохранение данных в JSONArray while (rs.next()) { JSONObject rowObject = new JSONObject(); for (int i = 1; i <= columnCount; i++) { rowObject.put(rs.getMetaData().getColumnName(i), (rs.getString(i) != null) ? rs.getString(i) : ""); } resultSet.put(rowObject); } } } } catch (SQLException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } finally { try { if (rs != null) rs.close(); if (st != null) st.close(); if (con != null) con.close(); } catch (SQLException e) { throw new RuntimeException(e.getMessage()); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } return resultSet; }
@Override protected void onPostExecute(JSONArray result) { switch (action){ case "get_dish_links" : { List links = conv.JSONtoLink(result); // вот здесь думал использовать вызов fill_spinner // нужного объекта, передав ему результат }
} }
}


Ответ

Создайте интерфейс
public interface MyInterface { void doSmth(JSONArray result); } Реализуйте его в активити
public class UA extends AppCompatActivity implements MyInterface{
@Override public void doSmth(JSONArray result) { System.out.println("вызван doSmth в Активити"); //вот и ваш результат из задачи в актвити }
... } Передавайте его в задачу через конструктор и вызывайте его метод, передавая туда результат из onPostExecute
public final class AsyncRequest extends AsyncTask {
MyInterface myInterface;
public AsyncRequest(MyInterface myInterface){ this.myInterface = myInterface; }
@Override protected void onPostExecute(JSONArray result) { System.out.println("вызван onPostExecute"); myInterface.doSmth(result); } } В активити запускайте так:
new AsyncRequest(UA.this).execute(query);

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

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