【问题标题】:Android Retrofit failure()Android改造失败()
【发布时间】:2015-12-04 00:09:39
【问题描述】:

您好,我正在尝试制作一个可以从 web url 获取 lat long 的应用程序

http://akshay.site90.net/getLats.php?username=rakesh

结果将采用格式

{"lat":"30.1328064900","longitude":"77.2865304300"}

我正在使用 Android Retrofit.. 但是当我打开应用程序时,每次都会调用改造的 failure() 而不是 success() 我不知道出了什么问题。。 它应该调用 onSucces()

interface  api.java
package com.example.akshay.parentapp;

    import retrofit.http.GET;

    /**
     * Created by Akshay on 9/8/2015.
     */
    public interface api {
        @GET("/getLats.php?username=rakesh")
        public void getData( retrofit.Callback<getGSONData> response);
    }

getGSONData.java

package com.example.akshay.parentapp;

import android.util.Log;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

/**
 * Created by Akshay on 9/8/2015.
 */
public class getGSONData {

    @SerializedName("lat")
    @Expose
    public String lat;

    @SerializedName("longitude")
    @Expose
    public String longitude;

    public void getlat(String lat) {
        this.lat = lat;
    }

    public Double setLat() {
        Log.e("====LAT", lat);
        return Double.parseDouble(lat);
    }

    public void getlongitude(String longitude) {
        this.longitude = longitude;
    }

    public Double setLong() {
        Log.e("====LONG", longitude);
        return Double.parseDouble(longitude);
    }

}

Map.java

package com.example.akshay.parentapp;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.PolylineOptions;

import retrofit.Callback;
import retrofit.RestAdapter;
import retrofit.RetrofitError;
import retrofit.client.Response;

/**
 * Created by Akshay on 8/31/2015.
 */
public class Map extends FragmentActivity {
    public final String URL = "http://akshay.site90.net";
    LatLng prev = null;
    LatLng current = null;
    int flag = 0;
    GoogleMap googleMap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.map);
        googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
      LocationManager  locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                Log.e("OnLocationChanged" , "===========0");
                RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(URL).build();
               api api = restAdapter.create(api.class);
                api.getData( new Callback<getGSONData>() {
                    @Override
                    public void success(getGSONData getGSONData, Response response) {
                        Double LAT = getGSONData.setLat();
                        Double LONG = getGSONData.setLong();
                        current =  new LatLng(LAT , LONG);

                       Log.e("===LAT" , String.valueOf(LAT));
                        Log.e("===LONG" , String.valueOf(LONG));
                         if (flag == 0 & LAT!=null & LONG != null)
                         {
                             prev = current;
                             flag = 1;
                         }
                        CameraUpdate cm = CameraUpdateFactory.newLatLngZoom(current, 18);

                        PolylineOptions polylineOptions = new PolylineOptions();
                        polylineOptions.color(Color.RED).add(prev,current).width(20).visible(true);
                        googleMap.addPolyline(polylineOptions);
                        googleMap.animateCamera(cm);
                        prev = current;
                        current = null;


                    }

                    @Override
                    public void failure(RetrofitError error) {
Log.e("====" , "Something gone wrong");
                    }
                });

            }

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {

            }

            @Override
            public void onProviderEnabled(String provider) {

            }

            @Override
            public void onProviderDisabled(String provider) {

            }
        });


    }
}

【问题讨论】:

  • 是的,我在清单文件中确实拥有这两个权限
  • 您的命名约定有问题 - 类被命名为方法,包引用,getter 被命名为 setter,反之亦然
  • 只是为了澄清一下,你为什么在 onLocationChanged 内部进行网络调用有什么特殊原因?
  • 我只是想通过 LocationListener 调用它.. 但我也删除了整个位置 Stuff 但仍然发生同样的情况

标签: java android web-services retrofit


【解决方案1】:

打印

t.getCause()

在 onFailed 中告诉我可以帮助您

【讨论】:

    【解决方案2】:

    我可以看到一些可能导致一些问题的事情:

    1) 您的 Web API 将数据返回为“text/html”,而不是“application/json”,因此 Retrofit 可能无法正确读取。

    2) 尝试在基本 URL 的末尾添加一个“/”,使其看起来像这样:

    public final String URL = "http://akshay.site90.net/";
    

    3) 您的 setter/getter 在“getGSONData”类中是错误的。您的 getter 正在设置值,而您的 setter 正在获取值。

    【讨论】:

    • 我已经改变了你所说的但仍然是同样的问题
    • 你刚刚从 6 年前救了我的命
    【解决方案3】:

    感谢大家的支持

    Web URL 正在返回

    {"lat":"30.1329624300","longitude":"77.2864860400"}
    <!-- Hosting24 Analytics Code -->
    <script type="text/javascript" src="http://stats.hosting24.com/count.php"></script>
    <!-- End Of Analytics Code -->
    

    所以我从我的免费托管 000.webhost.com 中清除了 In Activity Adds 这行得通

    【讨论】:

      【解决方案4】:

      在改造 2 中,你可以像这样轻松地做到这一点:

      1. 在您的界面中,Api.class :

        public interface Api {  
          @GET("/getLats.php")
          Call<List<getGSONData>> getData(@Query("username") String username);
        }
        
      2. 在您的服务类中,比如说 ServiceGenerator.class :

        public class ServiceGenerator {
        
          public static final String API_BASE_URL = "http://your.api-base.url";
        
          private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        
          private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create());
        
          public static <S> S createService(Class<S> serviceClass) {
            Retrofit retrofit = builder.client(httpClient.build()).build();
            return retrofit.create(serviceClass);
          }
        }
        
      3. 在您的活动中,异步调用使用 enqueue :

         //prepare variable to contain result
         List<getGSONData> resultList;
        
         //create service
         Api myApi = ServiceGenerator.createService(Api.class);
        
         //instantiate the call and set parameters
         Call<List<getGSONData>> call = myApi.getData("rakesh");
        
         //enqueue for doing asynchronous, if you want to synchronous use 
         //execute().body() with try catch:
         //
         // resultList = call.execute().body();
        
         call.enqueue(new Callback<List<getGSONData>>() {
           @Override
           public void onResponse(Response<List<getGSONData>> response, 
                  Retrofit retrofit) 
           {
                 // handle success 
                 //code 200 ..300
                 if(response.isSuccesful())
                   resultList = response.body();
           }
        
           @Override
           public void onFailure(Throwable t) 
           {
              // handle failure
           }
         });
        

      【讨论】:

        【解决方案5】:

        您的 setter 和 getter 方法错误,请检查一下。应该是这样的

        public void setlat(String lat) {
            this.lat = lat;
        }
        
        public Double getlat() {
            Log.e("====LAT", lat);
            return Double.parseDouble(lat);
        }
        

        尝试在改造中使用addConverterFactory(GsonConverterFactory.create()),以便它的值可以直接映射到您的POJO 类。

        private static Retrofit.Builder builder =
        new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create());
        

        【讨论】:

          【解决方案6】:

          使用或调用 Call&lt;ResponseBody&gt; 而不是您创建的对象来显示所有 JSON 字符串,并在检查代码之前确保一切正常,因为这可能不会显示在 Postman 或在线网站中。

          【讨论】:

            猜你喜欢
            • 2021-11-22
            • 2020-09-11
            • 2019-11-15
            • 2017-08-16
            • 2018-11-14
            • 2020-02-09
            • 2019-12-12
            • 1970-01-01
            • 2014-12-17
            相关资源
            最近更新 更多