java - 如何通过 Android 中的 asynctask 从 Hashmap 获取输出?

标签 java android mysql jdbc hashmap

公共(public)类 confirmDeletePopUp 从另一个名为 removeUser 的类中的 EditText 获取并发送电子邮件。然后它通过 getDetailsAsync 类发送该电子邮件并调用 DBHelper getDeleteDetails 类来获取它需要的信息。

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


import java.util.HashMap;

public class confirmDeletePopUp extends AppCompatActivity {

    private TextView tvAccountLevel, tvFirstName, tvLastName, tvEmail, tvID;
    String removeEmail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_confirm_delete_pop_up);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        int width = dm.widthPixels;
        int height = dm.heightPixels;

        getWindow().setLayout((int) (width * .8), (int) (height * .8));

        tvID = (TextView) findViewById(R.id.tvID);
        tvAccountLevel = (TextView) findViewById(R.id.tvAccountLevel);
        tvFirstName = (TextView) findViewById(R.id.tvFirstName);
        tvLastName = (TextView) findViewById(R.id.tvLastName);
        tvEmail = (TextView) findViewById(R.id.tvEmail);
        final Button confirmDelete = (Button) findViewById(R.id.tvConfirmDelete);

        // Send request
        getDetailsAsync detailsAsync = new getDetailsAsync();
        detailsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);


        confirmDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (tvID.getText().toString().equals("") || tvEmail.getText().toString().equals("")){
                    Toast.makeText(confirmDeletePopUp.this, "ID & Email are empty", Toast.LENGTH_SHORT).show();
                }else {
                    confirmDeleteAsync cda = new confirmDeleteAsync();
                    cda.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
                }
            }
        });

    }

    // get email to remove from remove user class
    public void fromRemoveUser(String emailToRemove){
        removeEmail = emailToRemove;
    }

    private class getDetailsAsync extends AsyncTask<Void, Void, Void>{

        HashMap<String, String> details = new HashMap<>();

        @Override
        protected void onPreExecute() {

        }

        @Override
        protected Void doInBackground(Void... voids) {
            DBHelper db = new DBHelper();
            details = db.getDeleteDetails(removeEmail);
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            setValues(details.get("id"), details.get("accountLevel"),
                    details.get("firstName"), details.get("lastName"),
                    details.get("email"));
        }
    }

    private void setValues (String id, String al, String fn, String ln, String em){
        tvID.setText(id);
        tvAccountLevel.setText(al);
        tvFirstName.setText(fn);
        tvLastName.setText(ln);
        tvEmail.setText(em);
    }

我的问题是我无法判断 DBHelper 类是否真的从数据库中检索信息。这是 DBHelper 的代码。它应该将 Hashmap 返回到 confirmDeletePopUp 类中的 Hashmap 变量。然后将 TextViews 设置为找到的数据。但它从不返回任何数据。相反,我只是获得了该类的 gui 弹出 Activity ,其中只有字段中的提示。

// get details for deleting user
    public HashMap<String, String> getDeleteDetails (String email){

        HashMap<String, String> detail = new HashMap<>();

        String getDeleteDetails = "SELECT FROM * accounts WHERE email = '" + email + "'";

        try {
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(getDeleteDetails);

            while(rs.next()){
                detail.put("id", rs.getString(1));
                detail.put("accountLevel", rs.getString(2));
                detail.put("firstName", rs.getString(3));
                detail.put("lastName", rs.getString(4));
                detail.put("email", rs.getString(7));
            }

        } catch (SQLException e){
            e.getStackTrace();
        }

        return detail;
    }

最佳答案

只需更改 AsyncTask 中的类型即可返回 HashMap,如下所示:

private class getDetailsAsync extends AsyncTask<Void, Void, HashMap<String,String>> {



        @Override
        protected void onPreExecute() {

        }

        @Override
        protected HashMap<String, String> doInBackground(Void... voids) {
            DBHelper db = new DBHelper();
            HashMap<String, String> details = new HashMap<>();
            details = db.getDeleteDetails(removeEmail);
            return details;
        }

        @Override
        protected void onPostExecute(HashMap<String, String> hashMap) {
            setValues(details.get("id"), details.get("accountLevel"),
                    details.get("firstName"), details.get("lastName"),
                    details.get("email"));
        }
    }

您将在onPostExecute 方法中获取返回的详细信息HashMap

关于java - 如何通过 Android 中的 asynctask 从 Hashmap 获取输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40969088/

相关文章:

java - Java OutOfMemoryError 后,Tomcat 无法启动

java - 动态更改按钮的文本

java - 在 Java 1.5 项目中使用 Jmockit 时出现 UnsupportedClassVersionError

Android 以编程方式加载可绘制对象并调整其大小

mysql - 使用 odbc_func 写入多个字段的正确语法?

java - Java 库路径 Cloudera 中没有 Hadoop。提交 Java 作业时

java - Android Jelly bean 相机返回空 URI

android - 来自适配器的 OnResquestPermissionResult

php - 从 csv 文件中获取一个值,查看数据库,获取与该值匹配的记录的 id

php - RasPi上php5与mysql连接错误