Страницы

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

понедельник, 9 марта 2020 г.

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

#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);

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

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