美文网首页
Demo_OkHttp 3.9.1

Demo_OkHttp 3.9.1

作者: JS_Coder | 来源:发表于2017-12-12 05:46 被阅读0次

    Este Demo Tiene 4 Fragment:

    1. Noticia: Se Utiliza (Async GET , JsonString)
    2. Trasductor: Se Utiliza (Async POST , Form Parameters Request)
    3. Descarga: Se Utiliza(Async GET , ByteStream)
    4. FACE: Se Utiliza (Async POST, Multipart Request)

    Main

    Layout:

    activity_main.png

    Activity:

    • Creamos Un Adapter Para ViewPager<JS_FragmentPagerAdapter>
    public class JS_FragmentPagerAdapter<T extends Fragment> extends FragmentStatePagerAdapter { //FragmentStatePagerAdapter Se herencia de PagerAdapter
    
        private List<T> mList; // Lista<T> T=> depende Si meter Avtivity o Fragment
        private String[] content; // Títulos que Mostrar al TabLayout
        public JS_FragmentPagerAdapter(FragmentManager fm,List<T> list, String content[]) {
            super(fm);
            this.mList = list;
            this.content = content;
        }
    
        @Override
        public Fragment getItem(int position) {
            return mList.get(position);
        }
    
        @Override
        public int getCount() {
            return mList.size();
        }
    
        @Override
        public CharSequence getPageTitle(int position){
            return content[position % content.length];
        }
    
    }
    
    • MainActivity
    /*Variable */
    // Títulos Que Va a Poner Cada Fragment
    String content[] = {"Traduct","Noticia","Descarga","Face"};
    // Lista De Fragments
    private ArrayList<Fragment> fragments = new ArrayList<>();
    
    /**
    * Códigos Que Falta:
    * Aqui Tiene Que Inicial Los Fragments Y Mete A La Lista De Fragments
    **/
    
    /*Ajustar*/
     JS_FragmentPagerAdapter adapter = new JS_FragmentPagerAdapter(getSupportFragmentManager(),fragments,content);
    
    pagerView.setAdapter(adapter);
    tabLayout.setupWithViewPager(pagerView);
    tabLayout.setTabMode(TabLayout.MODE_FIXED); // Mode que Mostrar 
    
    

    FRAGMENTS

    Fragment => Noticia

    • Layout<XML>

      Arquitectura_Noticia.png
    • NoticiaRecycleView -> ItemRecycleView -> ItemCardView

    • Ademas El Item Para Mostrar Detalle de Cada Tema Es Un CardView


      Item.png
    • Step:

    1. Inicial RecycleView
    Sin Códigos(Es Sencillo)
    
    1. Hace Request (Petición)
      final Request request = new Request.Builder()// Request
                    .url(Constant.NOTICIA_URL)
                    .build();
    Call call = client.newCall(request);
    call.enqueue(new Callback){
    @Override
                public void onFailure(Call call, IOException e) {
                            // Error Connection
                }
    
               public void onResponse(Call call, Response response) throws   IOException {
                            // 1 .  Guardar Json Con SharedPreferences  Como Cache
                            
                            // 2.  Utilizar Gson ,Parse Json A Objeto
    
                            // 3. Descarga Imagen Con IntentService
    
                            // 4. Set Adapter Para Pintar UI
                }  
    
    }
    
    1. Cache Con SharedPreferences
    [ En Fragment 
       /*
        * Cache Propio
        * */
        private static final String JSON_CACHE = "noticia_Json";
        private static final String JSON_CACHE_TIME_OUT = "CACHE_TIME_OUT";
        private static final String JSON_CACHE_LAST_SUCCESS = "noticia_Json_last";
    ]
    
    [ Crear Un Class De Herramiento Por Ejemplo, Aquí Necesitamos ,String Para Json , Int Para Time_Out , long Para El Tiempo De La Ultima Vez  De Perticion]
    public class SharePrenceUtil {
        public static final String XML_FILE_NAME = "cache";
        /*
        * Guardar String A SharedPreferences
        * */
        public static void saveString(Context context, String title, String content) {
            SharedPreferences share = context.getSharedPreferences(XML_FILE_NAME, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = share.edit();
            editor.putString(title, content);
            editor.apply();
        }
        /*
        * Sacar String
        * */
        public static String getString(Context context, String title) {
            String content;
            SharedPreferences share = context.getSharedPreferences(XML_FILE_NAME,Context.MODE_PRIVATE);
            content = share.getString(title,"");
            return content;
        }
    
        public static void savaInt(Context context, String title, int content){
                    //Codigo
    }
        public static int getInt(Context context, String title){
                  //Codigo
    }
    
        public static void savaLong(Context context, String title, long content){
                 // Codigo
    }
    
        public static long getLong(Context context, String title){
                //Codigo
    }
    
    1. Json A Objeto (Gson)
        compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
    
       Usar:
                       Gson gson = new Gson();
                       XXX xxx = gson.fromJson(json,xxx.class);
    XXX => Es Nombre De Objeto
    
    // Creamos Un Objeto Para Guardar Los Valores De Json
    public class Noticias implements Serializable{
               /*
                String XXX;
                getXXX(){}
                setXXX(){}
                 */
    }
    
    1. Descarga Imagen Con IntentService
    // Si Hay Imagen , Ya Podemos Descargar
    
    
    public class DownloadImageService extends IntentService {
    
    // Obligatorio:
     /**
         * Creates an IntentService.  Invoked by your subclass's constructor
         */
        public DownloadImageService() {
            super("DownloadImageService");
        }
    
    // Aqui Uso URLConnection Para Conseguir Stream,Y Decode Con Bitmap , Ejemplo:
                URLConnection urlConnection = url.openConnection();
                Bitmap bitmap = BitmapFactory.decodeStream(urlConnection.getInputStream());
    
    // Y Guardar Al SD Con FileOutputSream
    FileOutputStream outputStream = new FileOutputStream(imageFile);
    bitmap.compress(Bitmap.CompressFormat.JPEG,50,outputStream);
    }
    

    Nesecita Permisos ,Si Va Toca SD

      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
    CacheDeImagen.png
    1. recycleView.setAdapter(adapter)

    Fragment => Traductor

    • Layout

      Layout_Traductor.png
    • Funcionalidad

     //RequestBody
            RequestBody requestBody = new FormBody.Builder()
                    .add(QUERY,con)
                    .add(FROM,from_id)
                    .add(TO,to_id)
                    .add(APP_ID,appid)
                    .add(SALT,salt)
                    .add(SIGN,sign)
                    .build();
    
            //Request
            final Request request = new Request.Builder()
                    .url(Constant.TRANS_URL)
                    .post(requestBody)
                    .build();
    

    Aqui Se Utiliza (Posting form parameters)


    Resultado.png

    Fragment => Descarga

    • Layout

      Descarga.png
    • Funcionalida

    public synchronized void start(){
            if (isDownloading)return;
            isDownloading = true;
            try {
                httpUtil.getContentLength(fileOffet.getUrl(), new okhttp3.Callback() {
    
                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        if (!response.isSuccessful() && response.code() != 200){
                            close(response.body());
                            resetStatus();
                            return;
                        }
    
                        // Conseguir  Recurso
                        fileLength = response.body().contentLength();
                        // Gestion I/O
                        close(response.body());
    
                        // Crear un holderFile ,para Ocupar SD => .tmp => invisible can not eliminar
                        tmpFile = new File(fileOffet.getFilePath(),fileOffet.getFileName());
                        if (!tmpFile.getParentFile().exists()) {tmpFile.getParentFile().mkdirs();}
                        RandomAccessFile tmpAccessFile = new RandomAccessFile(tmpFile,"rw"); // Read y Write
                        tmpAccessFile.setLength(fileLength);
    
                        //Start Task => difrentes Hilos
                        //Estimar size que var a descargar en cada Hilo
                        long threadSize = fileLength / THREAD_COUNT;
    
                        for (int threadId = 0; threadId< THREAD_COUNT; threadId++){
                            long startIndex = threadId * threadSize;
                            long endIndex = (threadId + 1) * threadSize - 1;
                            if (threadId == (THREAD_COUNT - 1)){endIndex = fileLength - 1;}
                            try { download(startIndex,endIndex,threadId);}
                            catch (Exception e) { e.printStackTrace();}
                        }
                    }
                    @Override
                    public void onFailure(Call call, IOException e) {
                        resetStatus();
                    }
                });
            } catch (Exception e) {
                e.printStackTrace();
                resetStatus();
            }
        }
    
    
        private void download(final long startIndex, final long endIndex, final int threadId)throws Exception{
            long newStartIndex = startIndex;
            final File cacheFile = new File(fileOffet.getFilePath(),"thread"+threadId+"_"+fileOffet.getFileName()+".cache");
            cacheFiles[threadId] = cacheFile;
            final RandomAccessFile cacheAccessFile = new RandomAccessFile(cacheFile,"rwd");
            if (cacheFile.exists()){// Si La Carpeta De Cache Existe File ,Entonces Sigue Descargando
                String startIndexStr = cacheAccessFile.readLine();
                try{newStartIndex = Integer.parseInt(startIndexStr);}catch (Exception e){
                    e.printStackTrace();
                }
            }
    
    private final int THREAD_COUNT = 4; // Maximo 4 Hilos Para Descarga
    

    Se Utilizar ByteStream ( I/O )


    ByteStream.png
    CarpetaDescarga.png

    Fragment => Face

    Es Para Verificar La Imagen Del Facial

    • Layout

      image.png
    • Funcionalidad

    MultipartBody.png

    Si Va Subir Una Imagen ,Tiene Que Tener MediaType , "image/png" etc...

    Search.png

    sp:

    Para Pintar En Async :
    getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
    //Codigo ,Aqui Ya Esta En El Hilo Principal
    }
    });

    Apartir Api 23 Permiso

      /*
       * Verificar Permisos
       * */
        private void verificaRPermission(){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
                    pedirPermiso();
                }
            }
        }
    
        /*
       * Perdir Permisos
       * */
        private void pedirPermiso(){
    
            if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)){
                configurarPermiso();
            } else {
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            }
        }
    
    

    相关文章

      网友评论

          本文标题:Demo_OkHttp 3.9.1

          本文链接:https://www.haomeiwen.com/subject/afybixtx.html