在 AsyncTask class 上使用共享首选项来显示数据
using shared preferences on AsyncTask class for display data
我卡住了 here.The 问题是我必须访问 SharedPreferences 值并在 AsyncTask class 中需要它。我如何在 My AsyncTask 中访问它?我需要它来显示 JSON 中的数据。当我尝试访问它时,"JSON parsing error : No Value lokasi"
这是我采用共享首选项的代码。我不想显示以下代码:
private String email = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
dataList = new ArrayList<>();
//lv = (ListView) findViewById(R.id.list);
//Fetching email from shared preferences
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
String email = sharedPreferences.getString(Config.EMAIL_SHARED_PREF,"Not Available");
//new GetEmail(email);
new GetContacts().execute(email);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
这是我获取数据的代码JSON。我不想显示以下代码:
private class GetContacts extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
HttpHandler sh = new HttpHandler();
String email = params[0]; //WHAT NOW ?
// Making a request to url and getting response
String url = "http://192.168.43.176/GOLearn/lokasi.php?imei="+email;
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("lokasi");
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString("id");
String name = c.getString("name");
String latitude = c.getString("latitude");
String longitude = c.getString("longitude");
// tmp hash map for single contact
HashMap<String, String> map = new HashMap<>();
// adding each child node to HashMap key => value
map.put("id", id);
map.put("name", name);
map.put("latitude", latitude);
map.put("longitude", longitude);
//contact.put("mobile", mobile);
// adding contact to contact list
dataList.add(map);
}
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG).show();
}
});
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(MapsActivity.this, "Json Data is downloading", Toast.LENGTH_LONG).show();
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
for (int x = 0; x < dataList.size(); x = x + 1) {
double latasal = Double.parseDouble(dataList.get(x).get("latitude"));
double longasal = Double.parseDouble(dataList.get(x).get("longitude"));
LatLng posisi = new LatLng(latasal, longasal);
String nama = dataList.get(x).get("name");
mMap.addMarker(new MarkerOptions()
.position(posisi)
.title(nama)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.min_marker))
);
mMap.moveCamera(CameraUpdateFactory.newLatLng(posisi));
}
}
}
这是我的 php 代码:
<?php
mysql_connect("localhost","root","");
mysql_select_db("db_golearn");
$id = $_REQUEST['imei'];
$query="select * from lokasi where id='$id'";
$hasil=mysql_query($query);
if(mysql_num_rows($hasil) > 0) {
$response = array();
$response["lokasi"] = array();
while ($data = mysql_fetch_array($hasil)) {
$h['id']= $data['id'];
$h['name']= $data['name'];
$h['latitude']= $data['latitude'];
$h['longitude']= $data['longitude'];
$h['imei']= $data['imei'];
array_push($response["lokasi"], $h);
}
$response["success"] = "1";
echo json_encode($response);
}
else {
$response["success"]=0;
$response["message"]="Tidak ada data";
echo json_encode($response);
}
?>
请帮忙
通常AsyncTask应该不会很复杂。在内部它是线程,我们只为特定任务使用线程,所以尽可能简单,只针对单个任务。
如果您想在 AsyncTask 中共享首选项值,请将它们作为参数传递。它简单且模块化。
我不能评论你的 question.So 我在这里问。
@Intan Iryanti:-你的问题在哪里?你想在哪里使用共享偏好?
在您的异步任务中添加以下构造函数
private class GetContacts extends AsyncTask<String, Void, Void> {
SharedPreferences sharedPreferences;
public GetContacts(SharedPreferences sharedPreferences)
{
this.sharedPreferences= sharedPreferences;
}
@Override
protected Void doInBackground(String... params) {
HttpHandler sh = new HttpHandler();
字符串电子邮件 = sharedPreferences.getString(Config.EMAIL_SHARED_PREF,"Not Available");
// Making a request to url and getting response
String url = "http://192.168.43.176/GOLearn/lokasi.php?imei="+email;
String jsonStr = sh.makeServiceCall(url);
...
...
}
如下调用异步任务
GetContacts getContacts=new getContacts(sharedPreferences);
getContacts.execute();
无法评论(没有足够的声誉),所以在这里提问。
您确定您所说的错误 JSON parsing error : No Value lokasi
与 SharedPreferences 有关吗?
您在代码中将电子邮件作为方法的参数:
....
@Override
protected Void doInBackground(String... params) {
HttpHandler sh = new HttpHandler();
String email = params[0]; // This line means that the email was
// in the params
....
所以,我认为错误不是由 sharedPreferences 引起的,而是代码正在接收的 JSON 对象的原因。
您正在尝试访问 JSON 中的 lokasi
对象:
....
....
// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("lokasi");
....
....
你确定它存在吗?
尝试打印出 jsonstring
Lod.d("GetContacts","the json string: "+ jsonStr);
编辑
此外,请检查 doInBackground()
中的电子邮件变量是否符合您的要求。这可能就是为什么您的 httpRequest 没有回复您想要的内容的原因。
您可以使用 :
再次检查您的电子邮件变量
Log.d("GetContacts"."email : "+email);
我卡住了 here.The 问题是我必须访问 SharedPreferences 值并在 AsyncTask class 中需要它。我如何在 My AsyncTask 中访问它?我需要它来显示 JSON 中的数据。当我尝试访问它时,"JSON parsing error : No Value lokasi" 这是我采用共享首选项的代码。我不想显示以下代码:
private String email = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
dataList = new ArrayList<>();
//lv = (ListView) findViewById(R.id.list);
//Fetching email from shared preferences
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
String email = sharedPreferences.getString(Config.EMAIL_SHARED_PREF,"Not Available");
//new GetEmail(email);
new GetContacts().execute(email);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
这是我获取数据的代码JSON。我不想显示以下代码:
private class GetContacts extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
HttpHandler sh = new HttpHandler();
String email = params[0]; //WHAT NOW ?
// Making a request to url and getting response
String url = "http://192.168.43.176/GOLearn/lokasi.php?imei="+email;
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("lokasi");
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString("id");
String name = c.getString("name");
String latitude = c.getString("latitude");
String longitude = c.getString("longitude");
// tmp hash map for single contact
HashMap<String, String> map = new HashMap<>();
// adding each child node to HashMap key => value
map.put("id", id);
map.put("name", name);
map.put("latitude", latitude);
map.put("longitude", longitude);
//contact.put("mobile", mobile);
// adding contact to contact list
dataList.add(map);
}
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG).show();
}
});
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(MapsActivity.this, "Json Data is downloading", Toast.LENGTH_LONG).show();
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
for (int x = 0; x < dataList.size(); x = x + 1) {
double latasal = Double.parseDouble(dataList.get(x).get("latitude"));
double longasal = Double.parseDouble(dataList.get(x).get("longitude"));
LatLng posisi = new LatLng(latasal, longasal);
String nama = dataList.get(x).get("name");
mMap.addMarker(new MarkerOptions()
.position(posisi)
.title(nama)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.min_marker))
);
mMap.moveCamera(CameraUpdateFactory.newLatLng(posisi));
}
}
}
这是我的 php 代码:
<?php
mysql_connect("localhost","root","");
mysql_select_db("db_golearn");
$id = $_REQUEST['imei'];
$query="select * from lokasi where id='$id'";
$hasil=mysql_query($query);
if(mysql_num_rows($hasil) > 0) {
$response = array();
$response["lokasi"] = array();
while ($data = mysql_fetch_array($hasil)) {
$h['id']= $data['id'];
$h['name']= $data['name'];
$h['latitude']= $data['latitude'];
$h['longitude']= $data['longitude'];
$h['imei']= $data['imei'];
array_push($response["lokasi"], $h);
}
$response["success"] = "1";
echo json_encode($response);
}
else {
$response["success"]=0;
$response["message"]="Tidak ada data";
echo json_encode($response);
}
?>
请帮忙
通常AsyncTask应该不会很复杂。在内部它是线程,我们只为特定任务使用线程,所以尽可能简单,只针对单个任务。
如果您想在 AsyncTask 中共享首选项值,请将它们作为参数传递。它简单且模块化。
我不能评论你的 question.So 我在这里问。 @Intan Iryanti:-你的问题在哪里?你想在哪里使用共享偏好?
在您的异步任务中添加以下构造函数
private class GetContacts extends AsyncTask<String, Void, Void> {
SharedPreferences sharedPreferences;
public GetContacts(SharedPreferences sharedPreferences)
{
this.sharedPreferences= sharedPreferences;
}
@Override
protected Void doInBackground(String... params) { HttpHandler sh = new HttpHandler(); 字符串电子邮件 = sharedPreferences.getString(Config.EMAIL_SHARED_PREF,"Not Available");
// Making a request to url and getting response
String url = "http://192.168.43.176/GOLearn/lokasi.php?imei="+email;
String jsonStr = sh.makeServiceCall(url);
...
... }
如下调用异步任务
GetContacts getContacts=new getContacts(sharedPreferences);
getContacts.execute();
无法评论(没有足够的声誉),所以在这里提问。
您确定您所说的错误 JSON parsing error : No Value lokasi
与 SharedPreferences 有关吗?
您在代码中将电子邮件作为方法的参数:
....
@Override
protected Void doInBackground(String... params) {
HttpHandler sh = new HttpHandler();
String email = params[0]; // This line means that the email was
// in the params
....
所以,我认为错误不是由 sharedPreferences 引起的,而是代码正在接收的 JSON 对象的原因。
您正在尝试访问 JSON 中的 lokasi
对象:
....
....
// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("lokasi");
....
....
你确定它存在吗? 尝试打印出 jsonstring
Lod.d("GetContacts","the json string: "+ jsonStr);
编辑
此外,请检查 doInBackground()
中的电子邮件变量是否符合您的要求。这可能就是为什么您的 httpRequest 没有回复您想要的内容的原因。
您可以使用 :
Log.d("GetContacts"."email : "+email);