В настоящее время я создаю приложение для Android, используя Android Volley для решения сетевых задач. Сейчас я не уверен, как я могу получить пользовательские данные с сервера после входа в систему. Единственный способ заставить его работать — мне нужно указать свое имя пользователя в URL, например Username=abc
, Ниже мой код Java.
(Основной) Профиль Fragment.java
public class ProfileFragment extends Fragment implements View.OnClickListener{
ProgressDialog dialog;
public ProfileFragment() {
// Required empty public constructor
}
public static final String JSON_URL = "http://192.168.1.6/profile.php?Username=abc";
private ListView listView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
dialog = new ProgressDialog(getActivity());
dialog.setMessage("Loading....");
dialog.show();
View rootView = inflater.inflate(R.layout.activity_listview, container, false);
listView = (ListView) rootView.findViewById(R.id.listView);
sendRequest();
return rootView;
}
private void sendRequest(){
StringRequest stringRequest = new StringRequest(Request.Method.GET, JSON_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
showJSON(response);
dialog.dismiss();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity().getApplicationContext(),error.getMessage(),Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
requestQueue.add(stringRequest);
}
private void showJSON(String json){
Profile_Details pj = new Profile_Details(json);
pj.parseJSON();
profile_details cl = new profile_details(getActivity(), profile_details.names, profile_details.date_of_birth, profile_details.street_add, profile_details.postal_code, profile_details.city, profile_details.state, profile_details.country);
listView.setAdapter(cl);
}
@Override
public void onClick(View v) {
sendRequest();
}
}
profile.php
<?php
define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DB','users');
$Username = $_GET["Username"];
$mysqli = mysqli_connect(HOST,USER,PASS,DB);
$stmt = $mysqli->prepare ("SELECT Name, Date_of_Birth,
Street_Add, Postal_Code, City, State, Country
FROM personal_details INNER JOIN user_details ON
user_details.User_ID = personal_details.User_ID
WHERE Username=?");
$stmt->bind_param('s', $Username);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($Name, $Date_of_Birth,
$Street_Add, $Postal_Code, $City, $State, $Country);
$rows = array();
/* fetch values */
while($stmt->fetch()) {
array_push($rows, array('Name'=>$Name,
'Date_of_Birth'=>$Date_of_Birth,
'Street_Add'=>$Street_Add, 'Postal_Code'=>$Postal_Code,
'City'=>$City, 'State'=>$State,
'Country'=>$Country));
}
/* close statement */
$stmt->close();
/* close connection */
$mysqli->close();
echo json_encode(array("result"=>$rows));
?>
Дополнительная информация. Я создал personal details
таблица, которая связана с user details
Таблица. Я думаю, что связующая часть в порядке. Ниже мой ответ JSON.
JSON
{
"result": [{
"Name": "John",
"Date_of_Birth": "1995-05-09",
"Street_Add": "abc street",
"Postal_Code": "12345",
"City": "def",
"State": "ghi",
"Country": "jkl"}]
}
Итак, как мне настроить Java-код, чтобы после входа в систему я мог прямо отображать профиль пользователя, для которого мне не нужно указывать имя пользователя в конце URL
,
Новое обновление!
Я получил ошибку ссылки на нулевой объект
FATAL EXCEPTION: main
Process: com.androidnewlearner, PID: 2885
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.HashMap com.androidnewlearner.content.SessionManager.getUserDetails()' on a null object reference
at com.androidnewlearner.mainactivity.ProfileFragment.sendRequest(ProfileFragment.java:84)
at com.androidnewlearner.mainactivity.ProfileFragment.onCreateView(ProfileFragment.java:74)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2192)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1299)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:758)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2363)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2149)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2103)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2013)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Вот мой SessionManager
Java-файл. Я копирую только строку, на которую указывает ошибка.
SessionManager.java
public HashMap<String, String> getUserDetails(){
// Use hashmap to store user credentials
HashMap<String, String> user = new HashMap<String, String>();
// User name
user.put(KEY_USERNAME, pref.getString(KEY_USERNAME, null));
// User password
user.put(KEY_PASSWORD, pref.getString(KEY_PASSWORD, null));
// return user
return user;
}
Обновлен профиль Fragment.java
public class ProfileFragment extends Fragment implements View.OnClickListener{
ProgressDialog dialog;
String url;
SessionManager session;
private String Username;
private String Acc_Pass;
SharedPreferences shared;
public ProfileFragment() {
// Required empty public constructor
}
private ListView listView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
dialog = new ProgressDialog(getActivity());
dialog.setMessage("Loading....");
dialog.show();
View rootView = inflater.inflate(R.layout.activity_listview, container, false);
//buttonGet = (Button) rootView.findViewById(R.id.buttonGet);
//buttonGet.setOnClickListener(this);
listView = (ListView) rootView.findViewById(R.id.listView);
sendRequest(Username, Acc_Pass); <------Here is the error
shared= getActivity().getSharedPreferences("Mypref", Context.MODE_PRIVATE);
return rootView;
//return inflater.inflate(R.layout.fragment_profile, container, false);
}
private void sendRequest(String Username, String Acc_Pass){
HashMap<String, String> user = session.getUserDetails(); <------Here is the error
Username = user.get(SessionManager.KEY_USERNAME);
Acc_Pass = user.get(SessionManager.KEY_PASSWORD);
RequestQueue requestQueue = VolleyController.getInstance(getActivity().getApplicationContext()).getRequestQueue();
String url = "http://192.168.1.6/json_dri_details2.php?Username="+Username+"&Acc_Pass="+Acc_Pass+"";
url = url.replaceAll(" ", "%20");
try {
URL sourceUrl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
Log.i("Getting url info",""+url);
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
showJSON(response);
dialog.dismiss();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity().getApplicationContext(),error.getMessage(),Toast.LENGTH_LONG).show();
dialog.dismiss();
}
});
requestQueue.add(stringRequest);
}
private void showJSON(String json){
Dri_Details pj = new Dri_Details(json);
pj.parseJSON();
profile_details cl = new profile_details(getActivity(), profile_details.names, profile_details.date_of_birth, profile_details.street_add, profile_details.postal_code, profile_details.city, profile_details.state, profile_details.country);
listView.setAdapter(cl);
}
@Override
public void onClick(View v) {
sendRequest(Username, Acc_Pass);
}
}
Задача ещё не решена.
Других решений пока нет …