2017-07-24 3 views
-1

Je voudrais poster des données à mon API si on clique sur un bouton flottant. J'utilise la rénovation. Voici comment j'accéder au bouton d'action flottant dans mon activité:Android post à API sur FloatingActionButton cliquez sur

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_inquiry); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    ButterKnife.bind(this); 

    service = RetrofitBuilder.createService(ApiService.class); 
    tokenManager = TokenManager.getInstance(getSharedPreferences("prefs", MODE_PRIVATE)); 


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
} 

Voici comment mon ApiService ressemble à:

public interface ApiService { 


    @POST("device") 
    @FormUrlEncoded 
    Call<PostResponse> device(@Field("device_name") String device_name, 
           @Field("device_producer") String device_producer, 
           @Field("device_pixel_width") int device_pixel_width, 
           @Field("device_pixel_height") int device_pixel_height, 
           @Field("device_ratio_width") int device_ratio_width, 
           @Field("device_ratio_height") int device_ratio_height, 
           @Field("device_android_version") char device_android_version, 
           @Field("device_status") int device_status); 

    @GET("posts") 
    Call<PostResponse> posts(); 
} 

Et c'est la classe post qui contient des accesseurs:

public class Post { 

    int id; 
    String title; 
    String body; 
    String device_name; 
    String device_producer; 
    int device_pixel_width; 
    int device_pixel_height; 
    int device_ratio_width; 
    int device_ratio_height; 
    char device_android_version; 
    int device_status; 

    public String getDeviceName() { return device_name; } 

    public void setDeviceName(String device_name) { this.device_name = device_name; } 

    public String getDeviceProducer() { return device_producer; } 

    public void setDeviceProducer(String device_producer) { this.device_producer = device_producer; } 

    public int getDevicePixelWidth() { return device_pixel_width; } 

    public void setDevicePixelWidth(int device_pixel_width) { this.device_pixel_width = device_pixel_width; } 

    public int getDevicePixelHeight() { return device_pixel_height; } 

    public void setDevicePixelHeight(int device_pixel_height) { this.device_pixel_height = device_pixel_height; } 

    public int getDeviceRatioWidth() { return device_ratio_width; } 

    public void setDeviceRatioWidth(int device_ratio_width) { this.device_ratio_width = device_ratio_width; } 

    public int getDeviceRatioHeight() { return device_ratio_height; } 

    public void setDeviceRatioHeight(int device_ratio_height) { this.device_ratio_height = device_ratio_height; } 

    public int getDeviceAndroidVersion() { return device_android_version; } 

    public void setDeviceAndroidVersion(char device_android_version) { this.device_android_version = device_android_version; } 

    public int getDeviceStatus() { return device_status; } 

    public void setDeviceStatus(int device_status) { this.device_status = device_status; } 

    public String getBody() { 
     return body; 
    } 

    public void setBody(String body) { 
     this.body = body; 
    } 

} 

PostResponse:

public class PostResponse { 

    List<Post> data; 

    public List<Post> getData() { 
     return data; 
    } 
} 

EDIT

J'ai essayé suivante:

service = RetrofitBuilder.createService(ApiService.class); 

    public void onClick(View view) { 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     int device_pixel_width = size.x; 
     int device_pixel_height = size.y; 
     call = service.device(android.os.Build.MODEL, android.os.Build.MANUFACTURER, device_pixel_width, device_pixel_height, metrics.heightPixels, metrics.widthPixels, android.os.Build.VERSION.SDK_INT, 1); 
     System.out.println("PUPS: " + call); 
     Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
       .setAction("Action", null).show(); 
    } 

mais je reçois ce message dans la console:

[email protected]8

Modifier :

Maintenant, ça ressemble à ceci, mais qu'est-ce que j'ai à faire exactement dans la fonction onResponse pour enregistrer les données dans ma base de données api?

Actuellement, il est inclus dans la méthode onFailure.

 call = service.device(android.os.Build.MODEL, 
       android.os.Build.MANUFACTURER, 
       device_pixel_width, device_pixel_height, 
       metrics.heightPixels, metrics.widthPixels, 
       android.os.Build.VERSION.SDK_INT, 1); 
     call.enqueue(new Callback<PostResponse>() { 
      @Override 
      public void onResponse(Call<PostResponse> call, Response<PostResponse> response) { 
       Log.w(TAG, "onResponse: " + response); 

       if(response.isSuccessful()){ 

       } else { 

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

      } 
     } 
+0

Alors, quelle est la question? Quel est le problème? – Piyush

+0

@Piyush Je ne sais pas comment publier des données après avoir cliqué sur le bouton, juste des données aléatoires est bien à titre d'exemple – utdev

Répondre

1

Le clic fait un objet de votre message de classe POJO, mettre les données à l'aide du constructeur de champs ou les setters, puis appelez device, mais changer un peu, comme celui-ci

Call<PostResponse> device(@Body Post postData); 

et appelez-le avec l'objet que vous avez créé dans la méthode. Pour obtenir la réponse faire quelque chose comme ça

call.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<PostResponse> call, Response<ResponseBody> response) { 
      //save the response wherever you want 
     } 

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

Hope this helps, et d'essayer à la lecture plus sur Retrofit, la façon dont il est censé être look utilisation à des tutoriels.

EDIT

Dans la méthode onResponse il vous donnera une réponse que l'API rend de l'édition. Si vous allez dans cette méthode, les données ont été enregistrées dans l'API et vous obtenez la réponse (par exemple si vous envoyez des données aux API, le back-end sauvegarde les données et vous donne une réponse avec les données exactes que vous envoyez + id, et ce sera dans votre réponse de l'API). En utilisant cela, vous connectez à la fois l'application Android et le back-end et assurez-vous que vous êtes sur la même page. Habituellement, vous surchargez l'objet d'envoi avec la réponse.

Et pour l'erreur, essayez de déboguer la méthode onFailure. Écrivez un Toast ou un Timber avec le t (objet Throwable) dedans et mettez un point de rupture pour que vous puissiez lire quelle est l'erreur. Et peut-être essayer de lire this, car il a une réponse à un problème similaire.

+0

que voulez-vous dire avec Pojo classe – utdev

+0

POJO - Plain Old Java Object. C'est un nom pour une classe java simple qui a quelques variables, getters et setters, suivant cet exemple votre classe Post est une classe pojo. – Dana

+0

Je vais accepter cela pour l'instant mais je ne pouvais pas le tester en détail pour l'instant :) – utdev