2017-01-20 3 views
0

Я разрабатываю приложение, которое периодически обновляет местоположение пользователя. Я делаю службу, и она работала, я посылаю результаты по трансляцииНе удается обновить местоположение на сервере

Intent i = new Intent("location_update"); 
      i.putExtra("lat",location.getLatitude()); 
      i.putExtra("lang",location.getLongitude()); 
      sendBroadcast(i); 

Я также получил результат здесь успешно:

   latData=String.valueOf(intent.getExtras().get("lat")); 
       langData=String.valueOf(intent.getExtras().get("lang")); 

до сих пор все работало нормально, но когда IAM пытается обновить базу данных Lat & языков например,

user.lang= Float.parseFloat(langData); 

Это дает мне исключение из null указателя, и это потому, что user.lang получает нулевое значение! Также я уверен, что на 100% я получаю данные от службы успешно и, чтобы убедиться, что я передаю данные в текстовое представление, он работал и периодически менялся. Безотносительно, это мой полный код для подключения

<?php 

include 'DB.php'; 

$data = file_get_contents("php://input"); 
$obj = json_decode($data); 
$db = DB::getInstance(); 
header('Content-Type: application/json'); 
if(!isset($obj->{'lang'})){ 
    print "{\"status\":0,\"message\":\"lang is Missing !\"}" ; 
}else if(!isset($obj->{'lat'})){ 
    print "{\"status\":0,\"message\":\"lat is Missing !\"}" ; 
}else if(!isset($obj->{'username'})){ 
    print "{\"status\":0,\"message\":\"username is Missing !\"}" ; 
}else{ 
    $lang = $obj->{'lang'}; 
    $lat = $obj->{'lat'}; 
    $username= $obj->{'username'}; 




    $update = $db->update('users', 
      [ 
       'lang'  => $lang, 
       'lat' => $lat, 
      ])->where('user_name','=',$username)->exec(); 

     if($update){ 
      print "{\"status\":1,\"message\":\"\"}" ; 
     } else { 
      print "{\"status\":0,\"message\":\"Error while updating\"}" ; 
     } 
    } 

Пользователь

public class User extends RealmObject{ 

@SerializedName("username") 
public String username; 
@SerializedName("password") 
public String password; 
@SerializedName("email") 
public String email; 
@SerializedName("lang") 
public float lang; 
@SerializedName("lat") 
public float lat; 
@SerializedName("id") 
public int id; 
public boolean isAdmin;} 

Основная деятельность

public class MainActivity2 extends AppCompatActivity { 

    private Button btn_start, btn_stop; 
    private TextView langLoc, latLoc,idupdate; 
    private BroadcastReceiver broadcastReceiver; 
    User user = new User(); 
    String latData , langData; 



    @Override 
    protected void onResume() { 
     super.onResume(); 

     if(broadcastReceiver == null){ 
      broadcastReceiver = new BroadcastReceiver() { 

       @Override 
       public void onReceive(Context context,Intent intent) { 



        latData=String.valueOf(intent.getExtras().get("lat")); 
        langData=String.valueOf(intent.getExtras().get("lang")); 
        //langLoc.setText(langData); 
        //latLoc.setText(latData); 




       } 
      }; 
     } 
     registerReceiver(broadcastReceiver,new IntentFilter("location_update")); 



     user.username= "mohamed"; 
     //user.lang= Float.parseFloat(langData); 

     //user.lat= (float) 15.15; 

     /*IncomingData 
     User user = Session.getInstance().getUser(); 
     if (user !=null){ 
      tv_email.setText(user.username); 

     }*/ 



     Webservice.getInstance().getApi().UpdateuserLocation(user).enqueue(new Callback<MainResponse>() { 

      @Override 
      public void onResponse(Call<MainResponse> call, Response<MainResponse> response) { 



      } 

      @Override 
      public void onFailure(Call<MainResponse> call, Throwable t) { 

      } 
     }); 



    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if(broadcastReceiver != null){ 
      unregisterReceiver(broadcastReceiver); 
     } 
    } 

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

     btn_start = (Button) findViewById(R.id.button); 
     btn_stop = (Button) findViewById(R.id.button2); 
     latLoc = (TextView) findViewById(R.id.lat); 
     langLoc = (TextView) findViewById(R.id.lang); 


     if(!runtime_permissions()) 
      enable_buttons(); 

    } 

    private void enable_buttons() { 

     btn_start.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //Service Start 
       Intent i =new Intent(getApplicationContext(),GPS_Service.class); 
       startService(i); 

      } 
     }); 

     btn_stop.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Intent i = new Intent(getApplicationContext(),GPS_Service.class); 
       stopService(i); 

      } 
     }); 

    } 

    private boolean runtime_permissions() { 
     if(Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ 

      requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},100); 

      return true; 
     } 
     return false; 
    } 


    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     if(requestCode == 100){ 
      if(grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){ 
       enable_buttons(); 
      }else { 
       runtime_permissions(); 
      } 
     } 
    } 

} 

Последняя вещь, когда я делаю данные пользователя статичным, как этот

user.username= "mohamed"; 
    user.lang= (float) 15.155; 

приложение отправляет данные на сервер и база данных обновлены успешно.

ответ

0

Проблема заключается в том, что ваша строка langData имеет значение null до инициализации в обратном вызове вашего приемника onReceive. Вам нужно переместить свой вызов parseFloat, чтобы переменная была инициализирована. Затем, как только переменные будут инициализированы, вы обновите своего пользователя и затем погасите запрос.

Как так:

  @Override 
      public void onReceive(Context context,Intent intent) { 
       latData=String.valueOf(intent.getExtras().get("lat")); 
       langData=String.valueOf(intent.getExtras().get("lang")); 

       user.lang= Float.parseFloat(langData); 
       user.lat= Float.parseFloat(latData); 

       Webservice.getInstance().getApi().UpdateuserLocation(user).enqueue(new Callback<MainResponse>() { 
        @Override 
        public void onResponse(Call<MainResponse> call, Response<MainResponse> response) { 
        } 

        @Override 
        public void onFailure(Call<MainResponse> call, Throwable t) { 
        } 
       }); 
      } 
+0

U означает, что права если (BroadcastReceiver == NULL) { BroadcastReceiver = новый BroadcastReceiver() { @Override общественного недействительными OnReceive (контекст Контекст, Намерение намерение) { latData = String.valueOf (intent.getExtras(). Get ("lat")); langData = String.valueOf (intent.getExtras(). Get ("lang")); user.lang = Float.parseFloat (langData); } }; if right Когда я делаю, что он не отправил данные на сервер –

+0

@ M.Magdy, я отредактировал ответ, чтобы включить изменения кода. См. Выше ^ –

Смежные вопросы