XNHttpRequest2.java 8.5 KB
package com.metroapp.utils;

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.KeyEvent;

import com.metroapp.R;
import com.metroapp.biz.ApiManager;
import com.metroapp.constant.SysConstant;
import com.metroapp.widget.CircleLoadingView;
import com.xiniunet.api.Constants;
import com.xiniunet.api.XiniuParser;
import com.xiniunet.api.XiniuRequest;
import com.xiniunet.api.XiniuResponse;
import com.xiniunet.api.error.ErrorType;
import com.xiniunet.api.internal.parser.json.ObjectJsonParser;
import com.xiniunet.api.internal.parser.xml.ObjectXmlParser;

import java.util.concurrent.TimeUnit;


/**
 * Created by YQ on 2017-10-19.
 */

public class XNHttpRequest2<T extends XiniuResponse> implements Handler.Callback
{
    public class XNHttpRequestDialog extends Dialog
    {
        protected Activity activity;
        public  XNHttpRequestDialog(Activity activity)
        {
            super(activity, R.style.commonDialog);
            this.activity = activity;
            setOwnerActivity(activity);

        }
        @Override
        protected void onCreate(Bundle bundle) {
            super.onCreate(bundle);
            CircleLoadingView view = new CircleLoadingView(getContext(), null);
            setContentView(view);
            view.startLoading();
            setCanceledOnTouchOutside(false);
            this.setOnKeyListener(new OnKeyListener() {
                @Override
                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                    // TODO Auto-generated method stub
                    if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 )
                    {
                        if (interrupt == true && XNHttpRequest2.this != null)
                        {

                            XNHttpRequest2.this.sendEndMessage();
                        }

                    }
                    return true;
                }
            });
        }


    }
    protected XNHttpRequestDialog xnHttpRequestDialog;

    private T xiniuResponse ;
    protected  Activity activity;
    protected volatile  Handler handler;
    protected final String endDialog = "8e7cd64dc38bfc222020e2b8102570fa";
    protected boolean interrupt = false;

    public boolean getInterrupt() {
        return interrupt;
    }

    public void setInterrupt(boolean interrupt) {
        this.interrupt = interrupt;
    }
    protected void sendEndMessage()
    {
        try{
            if (this.handler != null)
            {
                Message m = this.handler.obtainMessage();
                Bundle b = new Bundle();
                b.putString(endDialog, endDialog);
                m.setData(b);
                this.handler.sendMessage(m);
            }
        }catch (NullPointerException e){

        }




    }
    public XNHttpRequest2(Activity activity)
    {
        this.activity = activity;
        if (activity != null && activity instanceof Activity)
        {
            xnHttpRequestDialog = new XNHttpRequestDialog(activity);
        }
    }

    @Override
    public boolean handleMessage(Message message) {
        Bundle b = message.getData();
        do
        {
            if(b == null)
            {
                break;
            }
            String str = b.getString(endDialog) ;
            if ( str == null)
            {
                break;
            }
             if( XNHttpRequest2.this != null && this.handler != null && str.equals(endDialog))
            {
                throw new RuntimeException();
            }
        }
        while(false);
        return false;
    }

    public void post2(final XiniuRequest<T> xiniuRequest, final  Long sessionId, final PostCallBack<T> postCallBack )
    {
        final AsyncTask<String, Void, T> task = new AsyncTask<String, Void, T>() {
            @Override
            protected T doInBackground(String... params) {
                T response = null;
                try{
                    response  = ApiManager.client.execute(xiniuRequest, sessionId);
                }catch (Exception e){
                    response.addError(ErrorType.SYSTEM_ERROR,e.getMessage());
                }

                return response;
            }
            @Override
            protected void onPostExecute(final T response) {
                if (postCallBack != null)
                {
                    postCallBack.onResponse(xiniuRequest, response);
                }
            }
        }.execute();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    task.get(SysConstant.TIMEOUT, TimeUnit.MILLISECONDS);
                } catch (Exception e) {

                    //取消任务
                    if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) {
                        task.cancel(true);
                    }
                }
            }
        }).start();
    }
    public int post(final XiniuRequest<T> xiniuRequest)
    {
        return  post(xiniuRequest, null);
    }

    public int post(final XiniuRequest<T> xiniuRequest , final Long sessionId)
    {
        if (xnHttpRequestDialog != null)
        {
            xnHttpRequestDialog.show();
        }
        handler = new Handler(Looper.myLooper())
        {
            public void handleMessage(Message mesg)
            {
                if (XNHttpRequest2.this != null)
                {
                    XNHttpRequest2.this.handleMessage(mesg);
                }
            }
        };

        {
            final AsyncTask<String, Void, T> task = new AsyncTask<String, Void, T>() {
                @Override
                protected T doInBackground(String... params) {
                    XiniuParser<T> parser = null;
                    if (Constants.FORMAT_XML.equals(Constants.FORMAT_JSON)) {
                        parser = new ObjectXmlParser<T>(xiniuRequest.getResponseClass());
                    } else {
                        parser = new ObjectJsonParser<T>(xiniuRequest.getResponseClass(), false);
                    }
                    try{
                        xiniuResponse = ApiManager.client.execute(xiniuRequest,  sessionId);
                    }catch (Exception e){
                        if (xiniuResponse == null){
                            T  tRsp = parser.parse("{}");
                            tRsp.setBody("{}");
                            tRsp.addError(ErrorType.SYSTEM_ERROR, e.getMessage());
                            xiniuResponse = tRsp;
                        }else {
                            xiniuResponse.addError(ErrorType.SYSTEM_ERROR, e.getMessage());
                        }

                    }

                    return xiniuResponse;
                }
                @Override
                protected void onPostExecute(final T response) {
                    xiniuResponse = response;
                    if (XNHttpRequest2.this!= null){
                        XNHttpRequest2.this.sendEndMessage();
                    }

                }
            }.execute();

            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        task.get(SysConstant.TIMEOUT, TimeUnit.MILLISECONDS);
                    } catch (Exception e) {
                        //取消任务
                        if (task != null && task.getStatus() != AsyncTask.Status.FINISHED) {
                            task.cancel(true);
                        }
                    }
                    finally {
                        if (XNHttpRequest2.this!= null){
                            XNHttpRequest2.this.sendEndMessage();
                        }
                    }
                }
            }).start();
        }
        try
        {
            Looper.loop();
        }
        catch(RuntimeException e)
        {

        }
        finally {
            this.handler = null;
        }
        if (xnHttpRequestDialog != null)
        {
            if ( activity!=null && !activity.isFinishing()){
                xnHttpRequestDialog.dismiss();
            }
            else {
                xnHttpRequestDialog = null;
            }

        }
        return 0;
    }


    public  T getResponse()
    {
        return xiniuResponse;
    }


    public  interface PostCallBack<T extends XiniuResponse>
    {
        void onResponse(XiniuRequest xiniuRequest, T t);
    }
}