Есть окно с элементом 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);
Комментариев нет:
Отправить комментарий