#java #android #activity #android_asynctask
Есть окно с элементом 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 // нужного объекта, передав ему результат } } } }
Ответы
Ответ 1
Создайте интерфейс 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);
Комментариев нет:
Отправить комментарий