在 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);