【问题标题】:OkHttp - Android get Data from MySQL databaseOkHttp - Android 从 MySQL 数据库中获取数据
【发布时间】:2017-05-12 15:14:52
【问题描述】:

嘿,我是 android 开发的新手,我目前正在尝试建立与我的数据库的连接,以便我可以处理手机上的数据。

我在 php 中使用 OkHttp 和 mysqli。

我编写了一个处理程序来访问 .php 页面并进行数据库调用。

public class OkHttpHandler extends AsyncTask<String, Void, String> {

private OkHttpClient client = null;

public String latestMessage = "";

public OkHttpHandler(){

    client = new OkHttpClient();
}

@Override
protected String doInBackground(String... params) {
    Request.Builder builder = new Request.Builder();
    builder.url(params[0].toString());
    Request request = builder.build();

    try{
        Response response = client.newCall(request).execute();
        latestMessage = response.body().string();
        return response.body().string();
    } catch(Exception e){
        e.printStackTrace();
    }

    //latestMessage = "failed";
    return null;
}

我想做这样的事情:

    public int getSongwriterId(String songwriter) {
    OkHttpHandler okHttpHandler = new OkHttpHandler();
    okHttpHandler.execute(url_get_songwriter_id + "?songwriter=" + songwriter);
    String responseString = "";
    while(responseString == "") {
        responseString = okHttpHandler.latestMessage;
    }
    okHttpHandler.cancel(true);
    Songwriter s = getSongwriterFromJSON(responseString);

    return s.getId();
    }

现在,我知道这个丑陋的 while(true) 是一个糟糕的解决方案。但是我应该怎么做才能让我 100% 确定我在将它传递给“getSongwriterFromJSON”之前得到了我的 responseString? 我真的不明白它应该如何工作。

当我逐步调试代码时,代码运行良好,但应用程序只是不时出现黑屏,无需调试。我想那是由于 while(true) 循环,它可能只是运行和运行并为线程计时,这样我的后台线程就死了——我真的不知道了。

如果您提供帮助,请解释我做错了什么,以及我应该如何做对。谢谢。

编辑使用的php文件:

<?php
$response = array();

$con = @mysqli_connect("XXX", "XXX", "XXX", "XXX");

if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$sql = "Select * FROM songwriter ";
$sql .= "where composerName = '";
$sql .= $_GET["songwriter"];
$sql .= "'";

$query = mysqli_query($con,$sql);

// looping through all results
$response["songwriter"] = array();

while ($row = mysqli_fetch_array($query)) {
    $songwriter = array();
    $songwriter["id"] = $row["id"];
    $songwriter["composerName"] = $row["composerName"];
    $songwriter["arrangerName"] = $row["arrangerName"];

    // push single product into final response array
    array_push($response["songwriter"], $songwriter);
}

// echoing JSON response
echo json_encode($response);
?>

【问题讨论】:

  • 你的 PHP 脚本有响应吗?也添加你的 PHP 脚本
  • 我刚刚添加了我的 php 文件 - 是的,它确实给出了响应。它在调试模式下运行良好。但是如果我让它正常运行就不会完成它的工作。

标签: android okhttp


【解决方案1】:

您正在使用 OkHttp 的同步 API,而有一个 async,您应该使用:

while 是一个严重的瓶颈,你应该尽快移除它。试试这样的:

Request.java

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.Response;

/** Very basic Request helper **/
public class Request {

    public static OkHttpClient client = null;

    /**
      * Get the current OkHttpClient or creates a new one if it doesn't exists
      * @return OkHttpClient
      */

   public static OkHttpClient getClient(){

        if(client == null)
            client = new OkHttpClient();

        return client;
   }

    public Call get(String url, Callback callback) {

       okhttp3.Request request = new okhttp3.Request.Builder()
          .url(url)
          .get()
          .build();

       Call call = getClient().newCall(request);
       call.enqueue(callback);

       return call;

    }
}

活动

//...
public interface MyCallback {
   void run(Object data); //Generic callback
}


public void getSongwriterId(String songwriter, MyCallback myCallback) {


   Request.get(url_get_songwriter_id + "?songwriter=" + songwriter, new Callback() {
      @Override
      public void onFailure(Call call, IOException e) {
        //Handle error
      }

      @Override
      public void onResponse(Call call, final Response response) throws IOException {

         final String body = response.body().string(); //Get API response

         final Songwriter s = getSongwriterFromJSON(body);

         //Remove it if you just need to show the ID in the UI
         myCallback.run(s.getId())

         //OKHttp callback isn't in the main thread, 
         //UI operations need to be run in the main thread
         //That's why you should use runOnUiThread
         MyActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //Handle UI here if needed           
                ((TextView) findViewById(R.id.myTextView)).setText(s.getId());

            }
         });
      }
   });
}
//...

【讨论】:

    【解决方案2】:

    我可能错了,但你不应该在mysqli_connect前面写@

    $con = @mysqli_connect("XXX", "XXX", "XXX", "XXX");
    

    尝试将其替换为:

    $con = mysqli_connect("XXX", "XXX", "XXX", "XXX");
    

    显然用您的凭据替换 X'es。

    如果这不起作用(或者在 php 中允许在 mysqli_connect 前面有一个@,并且您在删除它后尝试过测试)请从您的计算机运行 PHP 脚本,将其显示为一个网站。确保您看到任何可见的错误。

    如果 PHP 脚本没有问题,请将带有固定标签的 Log.e 标签添加到您的 Java 代码中。试着看看那里有没有问题。确保连接也确实成功。

    【讨论】:

    • 你这样做 - 否则你会得到一个 networkonmainthreadexception...这就是我需要做所有这些异步工作的主要原因。
    • 忽略该部分(也将其删除):做其他事情
    • 我做到了 - 仍然无法工作。正如我所说 - 当我调试并慢慢扔掉它时,一切正常。我查看了代码中的每个方法和所有调用。只要我调试它就会一步一步地工作。但是当我让我的应用程序在没有调试的情况下运行时,它只是锁定并且不起作用。海事组织。问题是 "while(responseString == "") " 。
    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多