利用回调接口,写一个专门等待网络请求的dialog提示框

这个dialog是专门针对网络处理的:在进行网络处理的时候,比如对某个文章点赞、评论等等。开始请求网络,就要有dialog提醒用户等待,这个时候,用户点击了返回键,此时,dialog就会消失,但是,请求网络,还在继续。正确的逻辑是,点击了返回键键,dialog消失,请求网络停止。

我这里用的是xUtils3,进行的网络请求。
中止xUtils3请求网络的方法是:

private Callback.Cancelable cancelable;
params.setCancelFast(true);//这句话可有可无,最好加上
cancelable=x.http().post(params, new Callback.CommonCallback<String>() {...});

最后,在合适的地方

if (cancelable != null) {
    cancelable.cancel();
}

使用这个办法,会有一个警告

W/InputEventReceiver: Attempted to finish an input event but the input event receiver has already been disposed.

解决办法我现在还不知道。因为是警告,不影响使用。有了解该警告的朋友,请指教

1、写一个回调接口

package com.chen.demo;

public interface DialogCallBackListener {
    void ReceiveData(String flag);
}

2、写一个WaitingDialog,继承Dialog

package com.chen.demo;

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TextView;

public class WaitingDialog extends Dialog {

    private String text;
    public TextView txtView;

    private String type = "";

    private DialogCallBackListener dialogCallBackListener;

    /**
     * dialog显示的时候,监听返回键
     */
    DialogInterface.OnKeyListener keylistener = new DialogInterface.OnKeyListener() {
        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

                dismiss();
                dialogCallBackListener.ReceiveData(type);

                return true;
            } else {
                return false;
            }
        }
    };

    public WaitingDialog(Context context,DialogCallBackListener listener,String str) {
        super(context, R.style.WaitingDialog);

        dialogCallBackListener=listener;
        type=str;

        setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失
        setOnKeyListener(keylistener);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_waiting_dialog);
        txtView = (TextView) findViewById(R.id.text_waiting_dialog);
        txtView.setText(text);
    }

    public void setRoundName(String text) {
        this.text = text;
        if (txtView != null) {
            txtView.setText(text);
        }
    }

}

3、WaitingDialog 中用到的style和布局文件有:
style

<style name="WaitingDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="wrap_content"
    android:layout_height="100dp"
    android:layout_gravity="center_horizontal"
    android:background="@mipmap/loading_process_dialog_anim" >

    <ProgressBar
        android:id="@+id/pro_waiting_dialog"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_centerVertical="true"
        android:layout_marginLeft="20dp" />

    <TextView
        android:id="@+id/text_waiting_dialog"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_toRightOf="@id/pro_waiting_dialog"
        android:text="正在加载"
        android:textColor="#FF333333" />

</RelativeLayout>

4、MainActivity
注:我这里为了简单,就在一个activity中,写了3个按钮模拟,实际中,常见用法是,一个activity对应一个按钮,传过去当前activity的类名即可,以作标记区分

package com.chen.demo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity implements DialogCallBackListener{

    private TextView tv_1;
    private TextView tv_2;
    private TextView tv_3;

    private WaitingDialog waitDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_1 = (TextView) findViewById(R.id.tv_1);
        tv_2 = (TextView) findViewById(R.id.tv_2);
        tv_3 = (TextView) findViewById(R.id.tv_3);


        tv_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                waitDialog = new WaitingDialog(MainActivity.this,MainActivity.this,"MainActivity_1");
                waitDialog.setRoundName("111");

                waitDialog.show();
            }
        });

        tv_2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                waitDialog = new WaitingDialog(MainActivity.this,MainActivity.this,"MainActivity_2");
                waitDialog.setRoundName("222");
                waitDialog.show();
            }
        });

        tv_3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                waitDialog = new WaitingDialog(MainActivity.this,MainActivity.this,"MainActivity_3");
                waitDialog.setRoundName("333");
                waitDialog.show();

            }
        });

    }

    @Override
    public void ReceiveData(String flag) {
        if ("MainActivity_1".equals(flag)){
            Log.i("chen","------------MainActivity_1--------------");
        }

        if ("MainActivity_2".equals(flag)){
            Log.i("chen","------------MainActivity_2--------------");
        }

        if ("MainActivity_3".equals(flag)){
            Log.i("chen","------------MainActivity_3--------------");
        }
    }
}

5、MainActivity中布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

        <TextView
            android:id="@+id/tv_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_marginTop="50dp"
            android:text="第一个dialog"
            android:textSize="25sp"/>

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

        <TextView
            android:id="@+id/tv_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_marginTop="50dp"
            android:text="第二个dialog"
            android:textSize="25sp"/>

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

        <TextView
            android:id="@+id/tv_3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:layout_marginTop="50dp"
            android:text="第三个dialog"
            android:textSize="25sp"/>

    </RelativeLayout>

</LinearLayout>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值