2017-01-11 6 views
1

したがって、androidstudioにappとappをビルドしようとしています。私はmysqlデータベースからデータを取得し、これをアプリで使用したいと考えています。私は、オンラインでPHPスクリプトを使用して、データを取得するためのレスポンスを取得します。この部分全体が機能しています。しかし、取得した値(JSONオブジェクト内のIDと呼ばれる)をentriesというString変数に代入すると、それを保存するようなことはありません。私がsetData()の値を呼び出すと、nullを返します。誰かがそれにいくつかの光を当てることができますか?値はResponselistenerの変数に割り当てられていません

public class MainActivity extends AppCompatActivity { 

EditText editText; 

public String entries; 

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

editText = (EditText) findViewById(R.id.text); 

getData(); 
setData(); 

} 

public void getData(){ 
    Response.Listener<String> responseListenerCount = new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d("JSON Parser", response); 
      try { 
       JSONObject jsonResponse = new JSONObject(response); 
       boolean success = jsonResponse.getBoolean("success"); 
       if (success) { 



       entries = jsonResponse.getString("ID"); // HERE THE RETRIEVED VALUE IS ASSIGNED TO VARIABLE ENTRIES 
       Toast.makeText(getApplicationContext(), " Retrieving success ", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(getApplicationContext(), " Retrieving failed ", Toast.LENGTH_SHORT).show(); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     // HERE THAT VALUE IS NULL AGAIN 
    } 
}; 
CountRequest countRequest = new CountRequest(responseListenerCount); 
RequestQueue queue = Volley.newRequestQueue(MainActivity.this); 
queue.add(countRequest); 

} 

public void setData(){ 
    editText.setText(entries); 
}} 

これはリクエストキューで呼び出されるcountRequest.javaです。再び;この部分は正常に動作しているので、実際には関係ありません。

public class CountRequest extends StringRequest { 

private static final String LOGIN_REQUEST_URL = "*************"; 
private Map<String, String> params; 

public CountRequest(Response.Listener<String> listener){ 
    super(Request.Method.POST, LOGIN_REQUEST_URL, listener, null); 
    params = new HashMap<>(); 
} 

@Override 
public Map<String, String> getParams() { 
    return params; 
}} 
+0

ここにはPHPコードはありません。なぜこのようにタグ付けされていますか? – tadman

+0

申し訳ありませんが、私には、速くクリックして提案されました。 imew newbie:p –

+0

'JSONObject.getString(key)'で 'key'は大文字と小文字を区別します。あなたはそれを考えましたか? – noahnu

答えて

0

私はあなたのコードを試しましたが、私の見解からはうまくいきます。

public class MainActivity extends AppCompatActivity { 

EditText editText; 

public String entries="test"; 

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

    editText = (EditText) findViewById(R.id.text); 

    getData(); 
    System.out.println(entries); //here id null or in my case "test" 
    setData(); 


} 

public void getData(){ 
    Response.Listener<String> responseListenerCount = new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d("JSON Parser", response); 
      try { 
       JSONObject jsonResponse = new JSONObject(response); 
       int success = jsonResponse.getInt("success"); 
       if (success==1) { 



        entries = jsonResponse.getString("user_id"); //geting user id 
        System.out.println(entries); 
        Toast.makeText(getApplicationContext(), " Retrieving success ", Toast.LENGTH_SHORT).show(); 
       } else { 
        Toast.makeText(getApplicationContext(), " Retrieving failed ", Toast.LENGTH_SHORT).show(); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      System.out.println(entries); //id is still there 
      setData(); 
     } 
    }; 
    CountRequest countRequest = new CountRequest(responseListenerCount); 
    RequestQueue queue = Volley.newRequestQueue(MainActivity.this); 
    queue.add(countRequest); 
    System.out.println(entries); //here id null or in my case "test" 
} 

public void setData(){ 
    editText.setText(entries); 
}} 


public class CountRequest extends StringRequest { 

private static final String LOGIN_REQUEST_URL = "http://mypage.com/login_user.php?login=a&password=b"; 
private Map<String, String> params; 

public CountRequest(Response.Listener<String> listener){ 
    super(Request.Method.POST, LOGIN_REQUEST_URL, listener, null); 
    params = new HashMap<>(); 
} 

@Override 
public Map<String, String> getParams() { 
    return params; 
}} 



<?php 

$response = array(); 

if (isset($_GET['login']) && isset($_GET['password'])) { 

$login = $_GET['login']; 
$password = $_GET['password']; 

require_once __DIR__ . '/db_connect.php'; 

$db = new DB_CONNECT(); 


$checkUser = mysql_query("Select * FROM user where login = '$login'"); 

if(mysql_num_rows($checkUser)>0){ 

     $result = mysql_fetch_array($checkUser); 
     $userpassword = $result["password"]; 
     $user_id = $result["user_id"]; 

     $response["success"] = 1; 
     $response["message"] = $userpassword; 
     $response["user_id"] = $user_id; 
     echo json_encode($response); 
} 

else{ 
     $response["success"] = 0; 
     $response["message"] = "User not found"; 
     echo json_encode($response); 
} 
} 
else { 
$response["success"] = 0; 
$response["message"] = "Required field(s) is missing"; 

echo json_encode($response); 
} 

?> 

<?php 

define('DB_USER', "*******"); // db user 
define('DB_PASSWORD', "*******"); // db password 
define('DB_DATABASE', "*******"); // database name 
define('DB_SERVER', "localhost"); // db server 

class DB_CONNECT { 

function __construct() { 
    $this->connect(); 
} 

function __destruct() { 
    $this->close(); 
} 

function connect() { 

    $con = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die(mysql_error()); 

    $db = mysql_select_db(DB_DATABASE) or die(mysql_error()) or die(mysql_error()); 

    return $con; 
} 


function close() { 
    mysql_close(); 
} 

} 

?> 
私はあなたがERRを取得している場合だと思います:私はこのスクリプトを使用しましたまたは、LOGIN_REQUEST_URL/paramsまたはPHPスクリプトで、DBからデータを取得しているかのように指定します。この場合、onCreateメソッドのsetData()は常にnullを返します。あなたはバックグラウンドで動作するレスポンスに 'entries'の値を設定しています。だからあなたのコードはGetData()にサーバーにリクエストを送り、次のコマンドに移動します。これはsetData()であり、ダウンロードされた情報を待っていません。

+0

それで、問題は確かに、responselistenerが依然としてビジーだったときに、setData()のエントリの値を思い出したのです。私は今、setData()をonclicklistenerに入れて、時間を与えることができるようにしています。ありがとう! –

関連する問題