2016-05-03 21 views
0

Ich habe eine Android-App, die gut funktioniert auf anderen Android-Geräten, aber es scheitert an Samsung S3 Android android Version 4.0.4 auf Daten. Retrofit wirft 404 (Seite nicht gefunden Fehler), aber die Seite existiert und wenn ich die gleiche Anfrage über WLAN mache es funktioniert gut. Jeder mit einer Idee, was falsch sein könnte. DankNachrüstung versagt bei Samsung s3 Android-Version 4.0.4 während auf Daten

finden Sie unter dem Stack-Trace

retrofit.RetrofitError: 404 Not Found 
    at retrofit.RestAdapter$RestHandler.invokeRequest (RestAdapter.java:388) 
    at retrofit.RestAdapter$RestHandler.access$100 (RestAdapter.java:220) 
    at retrofit.RestAdapter$RestHandler$2.obtainResponse (RestAdapter.java:278) 
    at retrofit.CallbackRunnable.run (CallbackRunnable.java:42) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:569) 
    at retrofit.Platform$Android$2$1.run (Platform.java:142) 
    at java.lang.Thread.run (Thread.java:856) 

Unten ist der Code Ich bin mit dem Anruf

val tailorsInterface = RestAdapter.Builder() 
       .setEndpoint(resources.getString(R.string.base_url)) 
       .build().create(TailorsInterface::class.java) 

    tailorsInterface.addTailor(txtName.text.toString(), txtEmail.text.toString(), 
       Utils.parsePhone(txtPhone.text.toString(), "254"), txtAddress.text.toString(), 
       txtLon.text.toString(), txtLat.text.toString(), txtPassword.text.toString(), 
       Common.LOCATIONS!!.get(spTowns.selectedItemPosition).id, object : Callback<DefaultResponse> { 


      override fun success(defaultResponse: DefaultResponse, response: Response) { 
       dialog.hide() 
       if(defaultResponse.success == 1.toLong()){ 
        val alertDialog: AlertDialog 
        val builder = AlertDialog.Builder([email protected]) 
          .setTitle(resources.getString(R.string.app_name)) 
          .setMessage("Tailor successfully registered, click OK to continue to login") 
          .setPositiveButton("OK") { dialog, which -> run{dialog.dismiss() 
           val loginIntent: Intent = Intent([email protected], TailorsLoginActivity::class.java) 
           startActivity(loginIntent) 
          } } 
        alertDialog = builder.create() 
        alertDialog.show() 

       }else{ 
        val alertDialog: AlertDialog 
        val builder = AlertDialog.Builder([email protected]) 
          .setTitle(resources.getString(R.string.app_name)) 
          .setMessage("An Error occurred please try again later") 
          .setPositiveButton("OK") { dialog, which -> run{dialog.dismiss() 
           finish()} } 
        alertDialog = builder.create() 
        alertDialog.show() 
       } 
      } 

    @FormUrlEncoded 
    @POST("/tailors") 
    public fun addTailor(@Field("name") name: String, @Field("email") email: String, 
        @Field("phone") phone: String, @Field("address") address: String, 
        @Field("lon") lon: String, @Field("lat") lat: String, 
        @Field("password") password: String, @Field("town") town: Int, 
        cb: Callback<DefaultResponse>) 

    data class DefaultResponse (
      var success: Long, 
      var message: String 
    ) 
+0

Code hinzufügen, wie Sie anrufen. –

+0

@RohitArya Ich habe den Code wie gewünscht hinzugefügt. – lemaiyan

Antwort

0

Nach vielen Tagen der Fehlersuche zu machen versuchen, das Problem, herauszufinden, was ich schließlich fand eine Lösung das Problem ist nicht nachzurüsten, aber es ist der Webserver, den ich benutze. Ich habe meine Anwendung in Clojure getan und ich verwende http-kit als mein Webserver und Komponente für das Routing.

Aus irgendeinem Grund Anforderungen, die von s3 kommen die URI in der http-kit-Anforderungskarte enthält auch den Host daher wird es keine Route auf meiner defroute zugeordnet. Zum Beispiel sagen, wenn die Route, die ich suche, ist /login die URI in der http-kit Anfrage Karte für die Anfrage von der s3 kommt http://example.com/login, aber von den anderen Telefonen enthält es /login. Daher hat die uri keine meiner Routen entsprechen ich in der compojure defroute definiert haben und geht direkt auf nicht-gefunden und damit die 404-Fehler

Die Lösung

Um dieses Problem zu lösen, musste ich verlängern Compojureroutes.clj und fügte hinzu, die folgende Funktion

(defn other-found 
"if for some reason the route is defined and is not found " 
[body] 
(fn [request] 
    (-> (response/render body request) 
    (status 200) 
    (cond-> (= (:request-method request) :head) (assoc :body nil))))) 

In defroute wenn die uri ich die Funktion nicht abgestimmt ist verwenden other-found und es passieren das die Funktion not-found-page (können Sie diese Funktion benennen, wie Sie wollen c alles es) in der Funktion Ich bekomme die URI aus dem Anfrageparameter parse es und bekomme den Endpunkt dann verwenden condp, um den Endpunkt auf die entsprechende Funktion abzubilden.

Hoffe das hilft jemand mit einem ähnlichen Problem.