【问题标题】:Custom Async Http Client in AndroidAndroid 中的自定义异步 Http 客户端
【发布时间】:2014-10-21 07:27:28
【问题描述】:

我使用https://github.com/loopj/android-async-http,但我认为这可以应用于异步任务(本机任务)

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
       //Some debugging code here
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
        //here is the interesting part
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
         //Some debugging code here, show retry dialog, feedback etc. 
    }

    @Override
    public void onRetry(int retryNo) {
         //Some debugging code here-------

    }
});

我在很多单独的课程中经常使用它。 onStart、onFailure 和 onRetry 到处都是一样的,只是复制粘贴,只是 onSuccess 不一样。

我想保持我的代码尽可能干净并重用我已经编写的内容,所以我的问题是,我如何在单独的“文件”中进行自定义,然后重用它。我只需要“OnSuccess”功能。谢谢

--------------------------------------

GET & POST 的解决方案(感谢 furkan3ayraktar)

第一个文件请求监听器

package com.classicharmony.krakenmessages.utils.AsyncHttp;
import org.apache.http.Header;
public interface RequestListener {
    public void onSuccess(int statusCode, Header[] headers, byte[] response);
}

第二个文件请求处理程序

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.Log;


import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;

import org.apache.http.Header;
import org.apache.http.entity.StringEntity;

import java.io.UnsupportedEncodingException;

public class RequestHandler {

    private static RequestHandler instance;

    private AsyncHttpClient client;
    private static final boolean SHOW_DEBUG_ALERT_DIALOG = true;

    private RequestHandler() {
        client = new AsyncHttpClient();

    }

    public static RequestHandler getInstance() {
        if (instance == null) {
            instance = new RequestHandler();
        }
        return instance;
    }


    public void make_get_Request(final Context context, final String url, final RequestListener listener) {
        client.get(url, new AsyncHttpResponseHandler() {

            @Override
            public void onStart() {
                Log.v("▒▒▒▒▒▒▒ GET ", url);
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                listener.onSuccess(statusCode, headers, response);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
                Log.e("▒▒▒▒▒▒▒ GET FAILED ", url);
                Log.e("▒▒▒▒▒▒▒ GET FAILED ", e.getLocalizedMessage());

                if (DUtils.isDebuggable(context) && SHOW_DEBUG_ALERT_DIALOG) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(context);
                    builder.setTitle("▒▒▒▒▒ ERROR ▒▒▒▒▒");
                    String error_msg;
                    if (errorResponse != null) {
                        try {
                            error_msg = String.valueOf(new String(errorResponse, "UTF-8"));
                        } catch (UnsupportedEncodingException e1) {
                            error_msg = e.getLocalizedMessage();
                        }
                    } else {
                        error_msg = e.getLocalizedMessage();
                    }

                    builder.setMessage(context.getClass().getSimpleName() + " -> " + error_msg)
                            .setCancelable(true)
                            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.dismiss();
                                }
                            });
                    AlertDialog alert = builder.create();
                    alert.show();
                }
            }

            @Override
            public void onRetry(int retryNo) {
                Log.e("▒▒▒▒▒▒▒ RETRYING ", "....." + String.valueOf(retryNo));

            }
        });
    }

    public void make_post_Request(final Context context, final StringEntity entity, final String url, final RequestListener listener) {
        client.post(context, url, entity, "application/json", new AsyncHttpResponseHandler() {

            @Override
            public void onStart() {
                Log.v("▒▒▒▒▒▒▒ POST ", url);
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                listener.onSuccess(statusCode, headers, response);
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
                Log.e("▒▒▒▒▒▒▒ POST FAILED ", url);
                Log.e("▒▒▒▒▒▒▒ POST FAILED ", context.getClass().getSimpleName() + " -> " + e.getLocalizedMessage());


                if (DUtils.isDebuggable(context) && SHOW_DEBUG_ALERT_DIALOG) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(context);
                    builder.setTitle("▒▒▒▒▒ ERROR ▒▒▒▒▒");
                    String error_msg;
                    if (errorResponse != null) {
                        try {
                            error_msg = String.valueOf(new String(errorResponse, "UTF-8"));
                        } catch (UnsupportedEncodingException e1) {
                            error_msg = e.getLocalizedMessage();
                        }
                    } else {
                        error_msg = e.getLocalizedMessage();
                    }

                    builder.setMessage(context.getClass().getSimpleName() + " -> " + error_msg)
                            .setCancelable(true)
                            .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.dismiss();
                                }
                            });
                    AlertDialog alert = builder.create();
                    alert.show();
                }

            }

            @Override
            public void onRetry(int retryNo) {
                Log.e("▒▒▒▒▒▒▒ RETRYING ", "....." + String.valueOf(retryNo));
            }
        });
    }

}

第三个“实用程序”是否显示对话框。

public static boolean isDebuggable(Context ctx) {
    boolean debuggable = false;
    X500Principal DEBUG_DN = new X500Principal("CN=Android Debug,O=Android,C=US");
    try {
        PackageInfo pinfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES);
        Signature signatures[] = pinfo.signatures;

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        for (int i = 0; i < signatures.length; i++) {
            ByteArrayInputStream stream = new ByteArrayInputStream(signatures[i].toByteArray());
            X509Certificate cert = (X509Certificate) cf.generateCertificate(stream);
            debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN);
            if (debuggable)
                break;
        }
    } catch (PackageManager.NameNotFoundException e) {
        //debuggable variable will remain false
    } catch (CertificateException e) {
        //debuggable variable will remain false
    }
    return debuggable;
}

示例如何为 POST 调用它:

JSONObject jsonParams = new JSONObject();
        StringEntity entity;


        try {
            jsonParams.put("from_user_id", "dan");
            jsonParams.put("to_user_id", "vili");
            jsonParams.put("message", "hello world");
            entity = new StringEntity(jsonParams.toString());
        } catch (JSONException e) {
            e.printStackTrace();
            return;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return;
        }

        RequestHandler handler = RequestHandler.getInstance();
        handler.make_post_Request(getActivity(), entity, "http://your_server/api/etc", new RequestListener() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                try {
                    String server_response = String.valueOf(new String(response, "UTF-8"));
                    Log.v("Server response",server_response);
                } catch (UnsupportedEncodingException e1) {

                }
            }
        });

【问题讨论】:

  • 非常感谢......它就像一个魅力......非常感谢......顺便说一句,它是在 2014 年编辑的......这一定是老式的。请告诉我您现在是否正在使用其他任何东西或相同的东西。再次感谢。
  • 好吧..有更新的方法...更容易....但如果它有效,然后使用它。在几个手机和版本上测试它,如果它完成了工作,就这样吧。
  • AYE.. 只是想知道.. 到目前为止我发现的最简单的方法。

标签: java android android-asynctask


【解决方案1】:

您可以创建自己的空版本AsyncHttpResponseHandler,它不实现onSuccess 方法。

public abstract class OWADVLHttpResponseHandler extends AsyncHttpResponseHandler {

    @Override
    public void onStart() {}

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {}

    @Override
    public void onRetry(int retryNo) {}
}

您的代码将如下所示:

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new OWADVLHttpResponseHandler() {
     @Override
     public void onSuccess(int statusCode, Header[] headers, byte[] response) {
      ....
    }
});

显然,你可以在基类的非覆盖方法中填写一些内容。

【讨论】:

    【解决方案2】:

    首先,您创建一个实现常见行为的抽象基类。像这样的:

    public abstract class AsyncHttpResponesHandlerBase implements AsyncHttpResponseHandler {
        @Override
        public void onStart() {
            // called before request is started
            // Some debugging code here
        }
    
        @Override
        public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
            // called when response HTTP status is "4XX" (eg. 401, 403, 404)
            //Some debugging code here, show retry dialog, feedback etc. 
        }
    
        @Override
        public void onRetry(int retryNo) {
            //Some debugging code here-------
        }
    }
    

    然后根据您从基类继承的 url 并实现 onSuccess() 方法来处理响应。

    public class GoogleGetHandler extends AsyncHttpResponesHandlerBase {
        @Override
        public void onSuccess(int statusCode, Header[] headers, byte[] response) {
            // called when response HTTP status is "200 OK"
            // do the Google specific handling
        }
    }
    

    然后你按如下方式发出 HTTP 请求:

    AsyncHttpClient client = new AsyncHttpClient();
    client.get("http://www.google.com", new GoogleGetHandler());
    

    因此,如果您想调用更多的 url,只需继续基于基类创建新的子类,以便继承常见的故障处理。

    【讨论】:

      【解决方案3】:

      创建通用请求处理程序和侦听器。您还可以为所需的每个请求创建不同的请求方法,例如 makeRequest,还可以创建不同的侦听器。这是我主要使用的一个简单模式,

      public class RequestHandler{
      
          private static RequestHandler instance;
      
          private AsyncHttpClient client;
      
          private RequestHandler(){
              client = new AsyncHttpClient();
          }
      
          public static RequestHandler getInstance(){
              if(instance == null){
                  instance = new RequestHandler();
              }
              return instance;
          }
      
          // You can add more parameters if you need here.
          public void makeRequest(String url, RequestListener listener){
              client.get(url, new AsyncHttpResponseHandler() {
      
                  @Override
                  public void onStart() {
                      // called before request is started
                      //Some debugging code here
                  }
      
                  @Override
                  public void onSuccess(int statusCode, Header[] headers, byte[] response) {
                      listener.onSuccess(statusCode, headers, response);
                  }
      
                  @Override
                  public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
                      // called when response HTTP status is "4XX" (eg. 401, 403, 404)
                      //Some debugging code here, show retry dialog, feedback etc. 
                  }
      
                  @Override
                  public void onRetry(int retryNo) {
                       //Some debugging code here-------
      
                  }
              });
          }
      }
      
      public interface RequestListener{
          public void onSuccess(int statusCode, Header[] headers, byte[] response);
      }
      

      然后在任何你想要的地方使用如下。

      RequestHandler handler = RequestHandler.getInstance();
      handler.makeRequest("http://www.google.com", new RequestListener(){
          @Override
          public void onSuccess(int statusCode, Header[] headers, byte[] response) {
              // do whatever you want here.       
          }
      });
      

      【讨论】:

      • 干得好。只是让听众最终。非常感谢
      【解决方案4】:
           *********************************************
                        Calling Api USing Retrofit
              *********************************************
              **Dependancies** :-
                    implementation 'com.android.support:recyclerview-v7:27.1.1'
                      implementation 'com.squareup.picasso:picasso:2.5.2'
                      implementation 'com.android.support:cardview-v7:27.1.1'
                      implementation 'com.loopj.android:android-async-http:1.4.9'
              implementation 'com.google.code.gson:gson:2.2.4'
      
                  enter code here
              **Model**
              use the Pozo class
      
              **Api Call**
               -> getLogin()    // use the method
      
      
      
                //API call for Login
                  private void getLogin()
                  {
                      getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                              WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                      AsyncHttpClient client = new AsyncHttpClient();
                      RequestParams requestParams = new RequestParams();
                      requestParams.put("email_id", edit_email.getText().toString());
                      requestParams.put("password", edit_password.getText().toString());
                      Log.e("", "LOGIN URL==>" + Urls.LOGIN + requestParams);
                      Log.d("device_token", "Device_ Token" + FirebaseInstanceId.getInstance().getToken());
                      client.post(Urls.LOGIN, requestParams, new JsonHttpResponseHandler() {
                          @Override
                          public void onStart() {
                              super.onStart();
                              ShowProgress();
                          }
      
                          @Override
                          public void onFinish() {
                              super.onFinish();
                              Hideprogress();
      
                          }
      
                          @Override
                          public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                              super.onSuccess(statusCode, headers, response);
                              Log.e("", "Login RESPONSE-" + response);
                              Login login = new Gson().fromJson(String.valueOf(response), Login.class);
                              edit_email.setText("");
                              edit_password.setText("");
                              if (login.getStatus().equals("true")) {
                                  getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                                  MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("User Login Successfully!"),
                                          MDToast.LENGTH_SHORT, MDToast.TYPE_SUCCESS);
                                  mdToast.show();
                                  Utils.WriteSharePrefrence(SignInActivity.this, Util_Main.Constant.EMAIL, login.getData().getEmailId());
                                  Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERID, login.getData().getId());
      
                                  Utils.WriteSharePrefrence(SignInActivity.this, Constant.USERNAME, login.getData().getFirstName());
                                  Utils.WriteSharePrefrence(SignInActivity.this, Constant.PROFILE, login.getData().getProfileImage());
                                  hideKeyboard(SignInActivity.this);
                                  Intent intent = new Intent(SignInActivity.this, DashboardActivity.class);
                                  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                  startActivity(intent);
                                  finish();
                              } else {
                                  getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                                  MDToast mdToast = MDToast.makeText(SignInActivity.this, String.valueOf("Login Denied"),
                                          MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
                                  mdToast.show();
                              }
                          }
      
                          @Override
                          public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                              super.onFailure(statusCode, headers, responseString, throwable);
                              Log.e("", throwable.getMessage());
                              getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
                              MDToast mdToast = MDToast.makeText(SignInActivity.this, "Something went wrong",
                                      MDToast.LENGTH_SHORT, MDToast.TYPE_ERROR);
                              mdToast.show();
                          }
                      });
                  }
      
          implements LocationListener {
          private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
              private String vendorId, vendorName, vendorPhone, vendorImg, vendorDistance, vendorStar, vendorRate, vendorAddress, vendorSummary, vendorOtherService;
              LocationManager locationManager;
              private FusedLocationProviderClient mFusedLocationProviderClient;
              private boolean mLocationPermissionGranted;
              private Location mLastKnownLocation;
      
              init()
          {
                      mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
          }
      
            @Click
              public void lnrCurrentLocation() {
                  getLocationPermission();
                  getDeviceLocation();
              }
      
                private void getDeviceLocation() {
      
                  try {
                      if (mLocationPermissionGranted)
                      {
                          final Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
                          locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>() {
                              @Override
                              public void onComplete(@NonNull Task<Location> task) {
      
                                  MarkerOptions markerOptions = new MarkerOptions();
                                  if (task.isSuccessful()) {
                                      mLastKnownLocation = task.getResult();
                                      if(mLastKnownLocation!=null)
                                      {
      
                                          Double lat = mLastKnownLocation.getLatitude();
                                          Double lng = mLastKnownLocation.getLongitude();
      
                                          Geocoder geocoder;
                                          List<Address> addresses;
                                          geocoder = new Geocoder(AddAddressActivity.this, Locale.getDefault());
      
                                          try {
                                              Log.e("latitude", "inside latitude--" + lat);
                                              addresses = geocoder.getFromLocation(lat, lng, 1);
      
                                              if (addresses != null && addresses.size() > 0) {
                                                  String address = addresses.get(0).getAddressLine(0);
                                                  String city = addresses.get(0).getLocality();
                                                  String state = addresses.get(0).getAdminArea();
                                                  String country = addresses.get(0).getCountryName();
                                                  String postalCode = addresses.get(0).getPostalCode();
                                                  String knownName = addresses.get(0).getFeatureName();
      
                                                  edtAddress.setText(address );
                                              }
                                          } catch (IOException e) {
                                              // TODO Auto-generated catch block
                                              e.printStackTrace();
                                          }
                                          if (lat != null && lng != null) {
                                              fastSave.saveString(Constant.CURR_LAT, String.valueOf(mLastKnownLocation.getLatitude()));
                                              fastSave.saveString(Constant.CURR_LON, String.valueOf(mLastKnownLocation.getLongitude()));
      
                                          } else {
                                              getDeviceLocation();
                                          }
                                      }
                                  }                  
      
                              }
                          });
                      }
                      else {
                          Log.d("@permision","========  Permision not found =========");
                      }
                  } catch (SecurityException e) {
                      Log.e("Exception: %s", e.getMessage());
                  }
              }
      
              private void getLocationPermission() {
      
                  if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                          android.Manifest.permission.ACCESS_FINE_LOCATION)
                          == PackageManager.PERMISSION_GRANTED) {
                      mLocationPermissionGranted = true;
                  } else {
      
                  }
              }
      
              @Override
              public void onRequestPermissionsResult(int requestCode,
                                                     @NonNull String permissions[],
                                                     @NonNull int[] grantResults) {
                  mLocationPermissionGranted = false;
                  switch (requestCode) {
                      case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
                          // If request is cancelled, the result arrays are empty.
                          if (grantResults.length > 0
                                  && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                              mLocationPermissionGranted = true;
                          }
                      }
                  }
              }
      
              void getLocation() {
                  try {
                      locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 5, this);
                  }
                  catch(SecurityException e) {
                      e.printStackTrace();
                  }
              }
      
              @Override
              public void onLocationChanged(Location location) {
      
              }
      
              @Override
              public void onStatusChanged(String provider, int status, Bundle extras) {
      
              }
              @Override
              public void onProviderEnabled(String provider) {
      
              }
      
              @Override
              public void onProviderDisabled(String provider) {
      
              }
          }
      
      "GOOGLE MAP IN ANDROID"
      
      implementation 'com.android.support:design:28.0.0'
          implementation 'com.google.android.gms:play-services-maps:11.8.0'
          implementation 'com.github.pedroSG94:AutoPermissions:1.0.3'
      
        <meta-data
                      android:name="@string/permissions_loader_meta_key"
                      android:value="android.permission.WRITE_EXTERNAL_STORAGE, android.permission.CAMERA,android.permission.ACCESS_FINE_LOCATION,android.permission.ACCESS_COARSE_LOCATION" />
      
         <meta-data
                  android:name="com.google.android.geo.API_KEY"
                  android:value="@string/google_maps_key" />
      
      implements OnMapReadyCallback, AutoPermissionsListener {
      
          private GoogleMap mMap;
      
       AutoPermissions.Companion.loadActivityPermissions(DashboardActivity.this, 1);
      
              SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                      .findFragmentById(R.id.map);
              mapFragment.getMapAsync(this);
      
        @Override
          public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
              AutoPermissions.Companion.parsePermissions(DashboardActivity.this, requestCode, permissions, this);
              }
      
              @Override
              public void onMapReady(GoogleMap googleMap) {
                  mMap = googleMap;
                  LatLng sydney = new LatLng(0.0, 0.0);
                  mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in India"));
                  mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
              }
      
          @Override
          public void onDenied(int i, String[] strings) {
      
          }
      
          @Override
          public void onGranted(int i, String[] strings) {
      
          }
      

      【讨论】:

        【解决方案5】:
                    -----------------------------------------------------
                                 LATEST Calling Api USing Retrofit
                            Api Call USING RETROFIT With GET & POST
                       -----------------------------------------------------
        
        
        
        
        
                        <uses-permission android:name="android.permission.INTERNET" />
                        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        
                    implementation "com.android.support:cardview-v7:28.0.0"
                        implementation 'com.android.support:recyclerview-v7:28.0.0'
                        implementation 'com.squareup.picasso:picasso:2.71828'
                        implementation 'com.google.code.gson:gson:2.8.5'
                        implementation 'com.squareup.retrofit2:retrofit:2.4.0'
                        implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
        
        
                            1] GET API WITH DISPLAY DATA IN RECYCLERVIEW  :-
        
                            ApiInterface
                            import retrofit2.Call;
                            import retrofit2.http.GET;
        
                            public interface ApiInterface
                            {
                                @GET("/photos")
                                Call<List<RetroPhoto>> getAllPhotos();
                            }
        
        
                        RestApiClient
                        mport retrofit2.Retrofit;
                        import retrofit2.converter.gson.GsonConverterFactory;
        
                        public class RestApiClient {
                            private static Retrofit retrofit;
                            private static final String BASE_URL = "https://jsonplaceholder.typicode.com";
                            public static Retrofit getRetrofitInstance() {
                                if (retrofit == null) {
                                    retrofit = new retrofit2.Retrofit.Builder()
                                            .baseUrl(BASE_URL)
                                            .addConverterFactory(GsonConverterFactory.create())
                                            .build();
                                }
                                return retrofit;
                            }
                        }
        
        
                        MainActivity
                        public class MainActivity extends AppCompatActivity {
        
                            private CustomAdapter adapter;
                            private RecyclerView recyclerView;
                            ProgressDialog progressDoalog;
        
                            @Override
                            protected void onCreate(Bundle savedInstanceState) {
                                super.onCreate(savedInstanceState);
                                setContentView(R.layout.activity_main);
                                progressDoalog = new ProgressDialog(MainActivity.this);
                                progressDoalog.setMessage("Loading....");
                                progressDoalog.show();
        
                                /*Create handle for the RetrofitInstance interface*/
                                ApiInterface service = RestApiClient.getRetrofitInstance().create(ApiInterface.class);
                                Call<List<RetroPhoto>> call = service.getAllPhotos();
                                call.enqueue(new Callback<List<RetroPhoto>>() {
                                    @Override
                                    public void onResponse(Call<List<RetroPhoto>> call, Response<List<RetroPhoto>> response) {
                                        progressDoalog.dismiss();
                                        generateDataList(response.body());
                                    }
        
                                    @Override
                                    public void onFailure(Call<List<RetroPhoto>> call, Throwable t) {
                                        progressDoalog.dismiss();
                                        Toast.makeText(MainActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
        
                            /*Method to generate List of data using RecyclerView with custom adapter*/
                            private void generateDataList(List<RetroPhoto> photoList) {
                                recyclerView = findViewById(R.id.customRecyclerView);
                                adapter = new CustomAdapter(this, photoList);
                                RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
                                recyclerView.setLayoutManager(layoutManager);
                                recyclerView.setAdapter(adapter);
                            }
                        }
        
        
                        activity_main
                           <android.support.v7.widget.RecyclerView
                                android:layout_width="match_parent"
                                android:id="@+id/customRecyclerView"
                                android:layout_height="match_parent"
                                />
                        custom_row
                        <?xml version="1.0" encoding="utf-8"?>
                        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                            android:orientation="horizontal"
                            android:gravity="center_vertical"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content">
        
                            <ImageView
                                android:id="@+id/coverImage"
                                android:layout_width="80dp"
                                android:layout_height="80dp" />
        
                            <TextView
                                android:id="@+id/title"
                                android:textSize="15dp"
                                android:gravity="center_vertical"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content" />
                        </LinearLayout>
        
                        RetroPhoto
                        import com.google.gson.annotations.SerializedName;
        
                        public class RetroPhoto {
        
                            @SerializedName("albumId")
                            private Integer albumId;
                            @SerializedName("id")
                            private Integer id;
                            @SerializedName("title")
                            private String title;
                            @SerializedName("url")
                            private String url;
                            @SerializedName("thumbnailUrl")
                            private String thumbnailUrl;
        
                            public RetroPhoto(Integer albumId, Integer id, String title, String url, String thumbnailUrl) {
                                this.albumId = albumId;
                                this.id = id;
                                this.title = title;
                                this.url = url;
                                this.thumbnailUrl = thumbnailUrl;
                            }
        
                            public Integer getAlbumId() {
                                return albumId;
                            }
        
                            public void setAlbumId(Integer albumId) {
                                this.albumId = albumId;
                            }
        
                            public Integer getId() {
                                return id;
                            }
        
                            public void setId(Integer id) {
                                this.id = id;
                            }
        
                            public String getTitle() {
                                return title;
                            }
        
                            public void setTitle(String title) {
                                this.title = title;
                            }
        
                            public String getUrl() {
                                return url;
                            }
        
                            public void setUrl(String url) {
                                this.url = url;
                            }
        
                            public String getThumbnailUrl() {
                                return thumbnailUrl;
                            }
        
                            public void setThumbnailUrl(String thumbnailUrl) {
                                this.thumbnailUrl = thumbnailUrl;
                            }
                        }
        
        
        
        
                        CustomAdapter
                        import android.content.Context;
                        import android.support.v7.widget.RecyclerView;
                        import android.view.LayoutInflater;
                        import android.view.View;
                        import android.view.ViewGroup;
                        import android.widget.ImageView;
                        import android.widget.TextView;
        
                        import com.squareup.picasso.Picasso;
        
                        import java.util.List;
        
                        public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {
        
                            private List<RetroPhoto> dataList;
                            private Context context;
        
                            public CustomAdapter(Context context,List<RetroPhoto> dataList){
                                this.context = context;
                                this.dataList = dataList;
                            }
        
                            class CustomViewHolder extends RecyclerView.ViewHolder {
        
                                public final View mView;
        
                                TextView txtTitle;
                                private ImageView coverImage;
                                CustomViewHolder(View itemView) {
                                    super(itemView);
                                    mView = itemView;
        
                                    txtTitle = mView.findViewById(R.id.title);
                                    coverImage = mView.findViewById(R.id.coverImage);
                                }
                            }
        
                            @Override
                            public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                                LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
                                View view = layoutInflater.inflate(R.layout.custom_row, parent, false);
                                return new CustomViewHolder(view);
                            }
        
                            @Override
                            public void onBindViewHolder(CustomViewHolder holder, int position) {
                                holder.txtTitle.setText(dataList.get(position).getTitle());
        
        
                                Picasso.get().load(dataList.get(position).getThumbnailUrl()).into(holder.coverImage);
        
                        //        Picasso.Builder builder = new Picasso.Builder(context);
                        //        builder.downloader(new OkHttp3Downloader(context));
                        //        builder.build().load(dataList.get(position).getThumbnailUrl())
                        //                .placeholder((R.drawable.ic_launcher_background))
                        //                .error(R.drawable.ic_launcher_background)
                        //                .into(holder.coverImage);
        
                            }
        
                            @Override
                            public int getItemCount() {
                                return dataList.size();
                            }
                        }
        
        
        
                            2] POST API WITH LOGIN :-
        
        
                ApiInterface
                import java.util.HashMap;
                import java.util.List;
                import java.util.Map;
                import retrofit2.Call;
                import retrofit2.Callback;
                import retrofit2.http.FieldMap;
                import retrofit2.http.FormUrlEncoded;
                import retrofit2.http.GET;
                import retrofit2.http.POST;
        
                public interface ApiInterface
                {
                    @FormUrlEncoded
                    @POST("/login")
                  //  void Login(@FieldMap Map<String, String> map, Callback<Login> callback);
                    Call<Login> Login(@FieldMap Map<String, String> map);
                }
        
        
                RestApiClient
        
                import retrofit2.Retrofit;
                import retrofit2.converter.gson.GsonConverterFactory;
        
                public class RestApiClient {
                    private static Retrofit retrofit;
                    private static final String BASE_URL = "http://wwwdemo.com/api/";
                    public static Retrofit getRetrofitInstance() {
                        if (retrofit == null) {
                            retrofit = new Retrofit.Builder()
                                    .baseUrl(BASE_URL)
                                    .addConverterFactory(GsonConverterFactory.create())
                                    .build();
                        }
                        return retrofit;
                    }
                }
        
        
        
                progressDoalog = new ProgressDialog(MainActivity.this);
                        progressDoalog.setMessage("Loading....");
                        progressDoalog.show();
                        Map<String, String> map = new HashMap<>();
                        map.put("email", edit_email.getText().toString());
                        map.put("password", edit_password.getText().toString());
                        map.put("device_type", "android");
                        map.put("device_token", "dfgdf");
                        ApiInterface service = RestApiClient.getRetrofitInstance().create(ApiInterface.class);
                        Call<Login> call = service.Login(map);
                        call.enqueue(new Callback<Login>() {
                            @Override
                            public void onResponse(Call<Login> call, Response<Login> response) {
                                progressDoalog.dismiss();
                                if (response.body().getStatus().equals("success")) {
                                    Toast.makeText(MainActivity.this, "Login Successfully", Toast.LENGTH_SHORT).show();
                                    Log.d("login", "===== Success ====");
                                } else {
                                    Toast.makeText(MainActivity.this, "Login Denied!", Toast.LENGTH_SHORT).show();
                                    Log.d("login", "===== Fail ====");
                                }
                            }
        
                                @Override
                                public void onFailure (Call < Login > call, Throwable t){
                                    progressDoalog.dismiss();
                                    Toast.makeText(MainActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
                                    Log.d("login", "===== Failure ====");
        
                                }
                            });
                        }
        
        
        
        
            OTHER TIP
        
            1 pass header is require token only. 
            @Header("Authorization") String Authorization
        
            2 to pass parameter vie Hasmap 
            Map<String, String> map = new HashMap<>();
            @FieldMap Map<String, String> map
        
            3 image upload with input
             @Multipart
                @POST("api")
                Call<Upload> uploadapi(@Header("Authorization") String token, @Part List<MultipartBody.Part> files, @PartMap Map<String, RequestBody> map);
                 ArrayList<MultipartBody.Part> multipart = new ArrayList<>();
                        Map<String, RequestBody> map = new HashMap<>();
        
                         map.put("key", RequestBody.create(MediaType.parse("text/plain"), value));
                        multipart.add(Utility.prepareFilePart(Activity.this, "document_file", picturePath));
        
                public static MultipartBody.Part prepareFilePart(Context context, String partName, String filePath) {
        
                    if(filePath!=null) {
                        File file = new File(filePath);
                        Log.d("TAG", "prepareFilePart: " + filePath);
            //        RequestBody requestBody = RequestBody.create(MediaType.parse(getContentResolver().getType(Uri.fromFile(file))), file);
        
                        // Libaray  Required
                        RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
        
                        //  Multipart   Camera and Gallery
                        //   RequestBody requestBody = RequestBody.create(MediaType.parse(context.getContentResolver().getType(FileProvider.getUriForFile(context, "com.sine.provider", file))), file);
                        return MultipartBody.Part.createFormData(partName, file.getName(), requestBody);
                    }
                    else {
                            return MultipartBody.Part.createFormData(partName,"");
                    }
                }
        
            4] void Login(@FieldMap Map<String, String> map, Callback<Login> callback);
        
            RetrofitClient.getInstance().getmRestClient().Login(map, new Callback<Login>() {
                                    @Override
                                    public void success(Login loginResponse, Response response) {
        
                                        }
                                    }
        
                                    @Override
                                    public void failure(RetrofitError error) {
        
                                    }
                                });
        
        
        
                                public class RetrofitClient {
                private final static String TAG = RetrofitClient.class.getSimpleName();
                private static final Object LOCK = new Object();
                private static FinalWrapper<RetrofitClient> helperWrapper;
                private final RestClient mRestClient;
        
                private RetrofitClient() {
                    // Rest client without basic authorization
                    mRestClient = ServiceGenerator.createService(RestClient.class);
                }
                public static RetrofitClient getInstance() {
                    FinalWrapper<RetrofitClient> wrapper = helperWrapper;
        
                    if (wrapper == null) {
                        synchronized (LOCK) {
                            if (helperWrapper == null) {
                                helperWrapper = new FinalWrapper<>(new RetrofitClient());
                            }
                            wrapper = helperWrapper;
                        }
                    }
                    return wrapper.value;
                }
        
                public RestClient getmRestClient() {
                    return mRestClient;
                }
        
        
                ServiceGenerator
            public class ServiceGenerator {
                private ServiceGenerator() {
                }
                public static <S> S createService(Class<S> serviceClass) {
                    final OkHttpClient okHttpClient = new OkHttpClient();
                    okHttpClient.setReadTimeout(Constant.CONNECTION_TIMEOUT, TimeUnit.SECONDS);
                    okHttpClient.setConnectTimeout(Constant.CONNECTION_TIMEOUT, TimeUnit.SECONDS);
        
                    RestAdapter.Builder builder = new RestAdapter.Builder()
                            .setEndpoint(Constant.BASE_URL)
                            .setLogLevel(RestAdapter.LogLevel.FULL)
                            .setClient(new OkClient(okHttpClient));
        
                    RestAdapter adapter = builder.build();
                    return adapter.create(serviceClass);
                }
        
        
        
                public static <S> S createService(Class<S> serviceClass, String username, String password) {
                    final OkHttpClient okHttpClient = new OkHttpClient();
                    okHttpClient.setReadTimeout(Constant.CONNECTION_TIMEOUT, TimeUnit.SECONDS);
                    okHttpClient.setConnectTimeout(Constant.CONNECTION_TIMEOUT, TimeUnit.SECONDS);
                    RestAdapter.Builder builder = new RestAdapter.Builder()
                            .setEndpoint(Constant.BASE_URL_USERS)
                            .setLogLevel(RestAdapter.LogLevel.FULL)
                            .setClient(new OkClient(okHttpClient));
        
                    if (username != null && password != null) {
                        // concatenate username and password with colon for authentication
                        final String credentials = username + ":" + password;
        
                        builder.setRequestInterceptor(new RequestInterceptor() {
                            @Override
                            public void intercept(RequestFacade request) {
                                // create Base64 encodet string
                                String string = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                                request.addHeader("Accept", "application/json");
                                request.addHeader("Authorization", string);
                            }
                        });
                    }
                    RestAdapter adapter = builder.build();
                    return adapter.create(serviceClass);
                }
        
        
                public class FinalWrapper<T> {
                public final T value;
        
                public FinalWrapper(T value) {
                    this.value = value;
                }
            }
        
            5 
            @GET("/place/autocomplete/json?")
                void getplacesLocationList(@Query("input") String str_input,@Query("radius") String radius, @Query("key") String key, Callback<PlacesLocation> callback);
        
        
        
        
        
        
        6  pass fist above only post method 
        interface
        @Headers("Content-Type:application/json;charset=UTF-8")
            @POST("api/")
            Call<Response> get(@Body RequestBody requestBody);
        
        Apiclient
        
        public class ApiClient {
        
            public static final String Tag = "ApiClient";
            private static final int CONNECTION_TIMEOUT = 30; //seconds
            private static final int READ_TIMEOUT = 20; //seconds
            private static final int WRITE_TIMEOUT = 20; //seconds
            private static MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
            private static MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*");
            private static Retrofit retrofit = null;
            private static Gson gson;
        
            public static Retrofit getClient() {
                if (retrofit == null) {
                    OkHttpClient okHttpClient;
                    if (BuildConfig.DEBUG) {
                        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
                        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                        okHttpClient = new OkHttpClient().newBuilder().connectTimeout
                                (CONNECTION_TIMEOUT,
                                        TimeUnit.SECONDS)
                                .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS).writeTimeout(WRITE_TIMEOUT,
                                        TimeUnit.SECONDS).addInterceptor(interceptor).build();
                    } else {
                        okHttpClient = new OkHttpClient().newBuilder().connectTimeout
                                (CONNECTION_TIMEOUT,
                                        TimeUnit.SECONDS)
                                .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS).writeTimeout(WRITE_TIMEOUT,
                                        TimeUnit.SECONDS).build();
                    }
                    retrofit = new Retrofit.Builder()
                            .client(okHttpClient)
                            .addConverterFactory(ScalarsConverterFactory.create())
                            .addConverterFactory(GsonConverterFactory.create())
                            .baseUrl(BASE_URL)
                            .build();
                }
                return retrofit;
            }
        
        
            @NonNull
            public static RequestBody makeTextRequestBody(Object stringData) {
                return RequestBody.create(MEDIA_TYPE_TEXT, String.valueOf(stringData));
            }
        
            @NonNull
            public static RequestBody makeGSONRequestBody(Object jsonObject) {
                if (gson == null) {
                    gson = new Gson();
                }
                return RequestBody.create(MEDIA_TYPE_TEXT, gson.toJson(jsonObject));
            }
        
            @NonNull
            public static String JSONResponse(Object jsonObject) {
                if (gson == null) {
                    gson = new Gson();
                }
                String params = gson.toJson(jsonObject);
                return params;
            }
        
            @NonNull
            public static RequestBody makeJSONRequestBody(JSONObject jsonObject) {
                String params = jsonObject.toString();
                return RequestBody.create(MEDIA_TYPE_TEXT, params);
            }
        
            public static JSONObject JSONObject(Object jsonObject) {
                if (gson == null) {
                    gson = new Gson();
                }
                try {
                    return new JSONObject(String.valueOf(gson.toJsonTree(jsonObject)
                            .getAsJsonObject()));
                } catch (JSONException e) {
                    AppLog.handleException(Tag, e);
                }
                return null;
            }
        }
        
        
                try{
                    JSONObject jsonObject = new JSONObject();
                            jsonObject.put(key, "");
                            jsonObject.put(key, "");
                            jsonObject.put(key, "");
                            jsonObject.put(key, "");
                    } catch (JSONException e) {
                    }
        
         ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
                    Call<Response> aaa = apiInterface.apiname(ApiClient
                            .makeJSONRequestBody(jsonObject));
                    aaa.enqueue(new Callback<Response>() {
                        @Override
                        public void onResponse(Call<Response> call, Response<Response> response) {
                            }
                        }
        
                        @Override
                        public void onFailure(Call<Response> call, Throwable t)
                         {
                        }
                    });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-31
          • 1970-01-01
          • 2017-12-15
          • 2017-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多