Android 使用 AsyncTask 连接 MySql 并以 JSON 或 String 的形式返回数据

Posted

技术标签:

【中文标题】Android 使用 AsyncTask 连接 MySql 并以 JSON 或 String 的形式返回数据【英文标题】:Android connecting with MySql using AsyncTask and return data in form of JSON or String 【发布时间】:2017-03-14 07:45:45 【问题描述】:

我一直在努力将 mysql 数据库连接到我的 android 应用程序并在互联网上进行搜索。一些解决方案适用于一个问题。问题是该函数以字符串形式返回数据,而字符串的内容是:

["id":1,"username":"admin","password":"root","email":"admin@localhost.com","fullname":"Site Admin"]

但我想要某种数组形式的数据,通过它我可以分别获取所有用户数据,如电子邮件、全名。我试图实现一个功能,但没有奏效。以下是代码:

BackgroundWorker.java

public class BackgroundWorker extends AsyncTask<String,Void,String> 
Context context;
AlertDialog alertDialog;
String tresult;


BackgroundWorker (Context ctx)
    context = ctx;

@Override
protected String doInBackground(String... params) 
    String type = params[0];
    String username = params[1];
    String password = params[2];

    String login_url = "http://192.168.1.18/myproj/api/query1.php";
    if (type.equals("login"))
        try 
            URL url = new URL(login_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            OutputStream outputStream = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
            String post_data = URLEncoder.encode("username","UTF-8")+"="+URLEncoder.encode(username,"UTF-8")+"&"+
                    URLEncoder.encode("password","UTF-8")+"="+URLEncoder.encode(password,"UTF-8");
            bufferedWriter.write(post_data);
            bufferedWriter.flush();
            bufferedWriter.close();

            outputStream.close();

            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
            String line="";
            String result="";

            while((line = bufferedReader.readLine())!= null)
                result+=line;
            

            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();

            return result;

         catch (MalformedURLException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        
    
    return null;


@Override
protected void onPreExecute() 
    super.onPreExecute();
    alertDialog = new AlertDialog.Builder(context).create();
    alertDialog.setTitle("Login Status");


@Override
protected void onPostExecute(String result) 
    alertDialog.setMessage(result);
    alertDialog.show();
    tresult = result;
    //return tresult;


@Override
protected void onProgressUpdate(Void... values) 
    super.onProgressUpdate(values);




BackgroundWorker 是一个在后台工作并与数据库连接的类。在 MainActivity 中调用如下:

MainActivity

public void onLogin(View view, String user, String pass)
    String type = "login";
    BackgroundWorker backgroundWorker = new BackgroundWorker(this);
    backgroundWorker.execute(type,user,pass);

函数调用:

        loginbtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            String username = user_edittext.getText().toString();
            String password = pass_edittext.getText().toString();
            onLogin(v,username,password);


        
    );

简而言之,我想在我的MainActivity 中返回来自protected void onPostExecute(String result) 的变量结果或结果并将其转换为数组。谢谢!等待专家意见。

【问题讨论】:

“我想要某种数组形式的数据,通过它我可以分别获取所有用户数据,如电子邮件、全名。我尝试实现一个功能,但没有成功。”。 .你不能从前端(即android / java)做到这一点。你必须以这种方式编写服务器端编码 从后端即 php 返回关联数组:$result = $sql-&gt;fetchAll(PDO::FETCH_ASSOC); echo json_encode($result);。我可以在 php 中分离细节,但在 android 中,它仍然会在一个字符串中给我。 【参考方案1】:

看来你有两个问题:

    将 Json 字符串转换为更友好的格式 将此友好格式返回到另一个活动

在 1 上: 在 Java 中没有解析 JSON 字符串的内置方法,但有很多简单的库选项可用 - 请查看讨论这些内容的 How to parse JSON in Java。

在 2 上: 一般来说,数据会被转换成一个包并作为意图系统的一部分返回到您的主要活动中

【讨论】:

好的,我拿到了第一个。你能解释一下或给出一些关于问题 2 的代码想法吗? BackgroundWorker.java 不是一个活动,它只是一个类。

以上是关于Android 使用 AsyncTask 连接 MySql 并以 JSON 或 String 的形式返回数据的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask *偶尔*遇到连接超时/错误问题、潜在的内存泄漏或 Android Studio 错误?

Android - 为 AsyncTask 设置超时?

Android Socket,AsyncTask,Handler内存泄漏

我应该使用 AsyncTask 建立 XMPP 连接吗?

Android Socket、AsyncTask、Handler 内存泄漏

如何解决替换 AsyncTask 以连接套接字的问题?