0

Я застрял здесь. Проблема в том, что мне нужно получить доступ к значению SharedPreferences и нуждаться в нем в классе AsyncTask. Как я могу получить к нему доступ в My AsyncTask? Мне нужно это для отображения данных в JSON. Когда я пытаюсь получить его, «JSON parsing error: No Value lokasi» Это мой код для использования общих настроек. Я не буду показывать следующий код:, используя общие настройки для класса AsyncTask для отображаемых данных

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. Я wan't для отображения с помощью следующего кода:

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); 
} 
?> 

Пожалуйста, помогите

+0

В чем проблема? – Praveen

+0

Проблема в том, что мне нужно получить доступ к значению SharedPreferences и нуждаться в ней в классе AsyncTask. Как я могу получить к нему доступ в My AsyncTask? Мне нужно это для отображения данных в JSON. Когда я пытаюсь получить его, «JSON parsing error: No Value lokasi» –

+0

Пожалуйста, покажите нам лог cat error log cat –

ответ

0

Я не могу ответить на ваш вопрос. Так что я прошу здесь. @ Интан Ирианти: где ваша проблема? Где вы хотите использовать общие предпочтения?

добавить следующий конструктор в вашей асинхронной задачи

private class GetContacts extends AsyncTask<String, Void, Void> { 
SharedPreferences sharedPreferences; 
     public GetContacts(SharedPreferences sharedPreferences) 
{ 
this.sharedPreferences= sharedPreferences; 
} 

@Override

защищен Пустота doInBackground (String ... Params) { HttpHandler ш = новый HttpHandler(); String email = sharedPreferences.getString (Config.EMAIL_SHARED_PREF, "Недоступно");

// 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(); 
+0

Я хочу использовать общие предпочтения по URL для отображения данных.
частный класс GetContacts extends AsyncTask { String email; public GetContacts (String email) { this.email = email; } @Override защищенный Void doInBackground (String ... params) { HttpHandler sh = new HttpHandler(); // Выполнение запроса на URL-адрес и получение ответа String url = "http://192.168.43.176/GOLearn/lokasi.php?imei="+email; Строка jsonStr = sh.makeServiceCall (url); –

+0

Передача общего предпочтения как конструктора для вашей задачи async разрешает вашу проблему. Правильно ?. –

+0

Как получить значение String электронной почты? все еще не может решить. –

0

Обычно AsyncTask не должен быть сложным. Внутренне это поток, и мы используем поток только для конкретной задачи, поэтому держите его максимально простым и конкретным только для этой единственной задачи.

Если вы хотите использовать общие настройки внутри AsyncTask, передайте их как параметры. Он простой и модульный.

+0

, как я могу уловить эти параметры в AsycnTask; –

0

Брус комментарий (не хватает репутации), так что с просьбой здесь ,

Вы уверены, что ошибка, о которой вы говорите, 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, что код принимается.

Вы пытаетесь получить доступ к lokasi объект в формате JSON:

.... 
.... 
// Getting JSON Array node 
JSONArray contacts = jsonObj.getJSONArray("lokasi"); 
.... 
.... 

вы уверены, что она существует там? Попробуйте распечатать jsonstring

Lod.d("GetContacts","the json string: "+ jsonStr); 

EDIT

Также, пожалуйста, проверьте, если переменная электронной почты внутри doInBackground() является то, что вы хотите быть. Это может быть причиной, почему ваш httpRequest не отвечает тем, что вы хотите. Вы можете снова проверить свою электронную почту, используя:

Log.d("GetContacts"."email : "+email);