利用Handler+ArrayList有序的处理事件
假如有这样一种需求:当服务器推送过来一条消息,我要显示一个Window,然后Window下面有一个按钮,点击这个按钮来对这条消息进行处理,处理方式可以是正面的,也可以是负面的。比如推送来一个订单信息,你选择接单就是正面的处理,你忽略或者取消这条订单就是负面处理。
一条消息好办,可是如果同一时间发送来N条消息,但是处理消息的按钮只有一个,该怎么办?点击这个按钮,我怎么知道我是处理了这N条消息中的哪一条消息?针对这样的问题,我的思路是:
1.先把这N条消息全部放到一个ArrayList当中;
2.只处理ArrayList当中的Location = 0位置的这条消息;
3.如果正面处理了这条消息,我就把列表清空,不在处理其他消息,如果是负面处理了当前这条消息,我再去检查列表是否还有消息,如果有消息,依次处理。
如果你也有这样的需求,不妨参考一下本篇文章提供的思路和实例。当推送来一条消息,要弹出一个Window,弹出Window可以用多种方式来实现,比如Dialog, AlertDialog, Activity(Dialog样式)和DialogFragment等等,首先用FragmentDialog来实现:
主Activity布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/id_btn_gen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="genMes"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginTop="100dp"
android:text="GenerateMessage" />
</LinearLayout>
主Activivity代码:
package com.example.sereventdemo;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class FragmentDiaAct extends FragmentActivity implements OnClickListener {
/**
* 生产事务按钮
*/
private Button mBtnGen;
/**
* 事务列表
*/
private List mMsgs = new ArrayList<>();
/**
* 标记事务是否被正面处理
*/
public static boolean isEventPosTackled = false;
/**
* 事务内容序号
*/
private int i = 0;
/**
* Dialog Fragment
*/
private EventDialog mEventDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_content);
mBtnGen = (Button)this.findViewById(R.id.id_btn_gen);
mBtnGen.setOnClickListener(this);
mEventDialog = new EventDialog();
mEventDialog.setHandler(mHandler);
}
@Override
public void onClick(View v) {
for (int j = 0; j < 3; j++) {
Message msg = mHandler.obtainMessage();
msg.what = 1;
msg.obj = “Message Content–>” + j;
mMsgs.add(msg);
}
if(mMsgs.size() != 0 && mMsgs.get(0) != null) {
mHandler.sendMessage(mMsgs.get(0));
mMsgs.remove(0);
}
}
/**
* Handler:用于接收事务的处理类型
*/
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
String content = (String) msg.obj;
mEventDialog.setContent(content);
mEventDialog.show(getSupportFragmentManager(), “Event”);
} else if (msg.what == 2) {
boolean b = (boolean) msg.obj;
if (b) {
if (mMsgs != null) {
mMsgs.clear();
Toast.makeText(FragmentDiaAct.this, “正面处理了当前事务,清空了事务列表”, Toast.LENGTH_SHORT).show();
}
} else {
if (mMsgs.size() != 0) {
if (null != mMsgs.get(0)) {
if (mEventDialog != null) {
mEventDialog.dismiss();
}
Message Msg = mMsgs.get(0);
Msg.what = 1;
sendMessage(Msg);
mMsgs.remove(0);
}
} else {
Toast.makeText(FragmentDiaAct.this, “负面遍历了所有事务”, Toast.LENGTH_SHORT).show();
}
}
}
}
};
}
DialogFragment代码:
package com.example.sereventdemo;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.DialogFragment;
public class EventDialog extends DialogFragment {
private Handler mHandler;
private String mContent = "消息内容";
public void setContent(String content) {
this.mContent = content;
}
public void setHandler(Handler handler) {
this.mHandler = handler;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setTitle("有新消息")
.setMessage(mContent)
.setPositiveButton("正面", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Message msg = mHandler.obtainMessage(2, true);
mHandler.sendMessage(msg);
}
}).setNegativeButton("负面", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Message msg = mHandler.obtainMessage(2, false);
mHandler.sendMessage(msg);
}
});
return builder.create();
}
}
如果你要处理事务的按钮是在弹出的Window之外,比如这个按钮时附在Activity之上,或者是附在Activity之上的Fragment之上,那么用Fragment来做弹出的Window或许会更加合适一点。
主Actitviy布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<FrameLayout
android:id="@+id/id_dialog_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:layout_width="230dp"
android:layout_height="350dp" />
<Button
android:id="@+id/id_btn_gen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="genMes"
android:layout_gravity="bottom|center_horizontal"
android:layout_marginTop="100dp"
android:text="GenerateMessage" />
</LinearLayout>
Fragment布局:
<?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" >
<LinearLayout
android:layout_width="230dp"
android:layout_height="150dp"
android:layout_gravity="top|center_horizontal"
android:layout_marginTop="80dp"
android:orientation="vertical" >
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="这里是标题" />
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="right|center_vertical"
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
</FrameLayout>
<TextView
android:id="@+id/id_txt_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:text="内容" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<Button
android:id="@+id/id_btn_neg"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="负面" />
<Button
android:id="@+id/id_btn_pos"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="正面" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
主Activit代码
package com.example.sereventdemo;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class FragmentAct extends FragmentActivity implements OnClickListener {
/**
* 生产事务按钮
*/
private Button mBtnGen;
/**
* 事务列表
*/
List<Message> mMsgs = new ArrayList<>();
/**
* 标记事务是否被正面处理
*/
public static boolean isEventPosTackled = false;
/**
* 事务内容序号
*/
private int i = 0;
/**
* FragmentManager用于管理Fragment
*/
private FragmentManager mManager;
/**
* Event Fragment
*/
private EventFragment mEventFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_content);
mBtnGen = (Button) this.findViewById(R.id.id_btn_gen);
mBtnGen.setOnClickListener(this);
mManager = getSupportFragmentManager();
}
@Override
public void onClick(View v) {
for (int j = 0; j < 3; j++) {
Message msg = mHandler.obtainMessage();
msg.what = 1;
msg.obj = "Message Content-->" + j;
mMsgs.add(msg);
}
if (mMsgs.size() != 0 && mMsgs.get(0) != null) {
mHandler.sendMessage(mMsgs.get(0));
mMsgs.remove(0);
}
}
/**
* Handler:用于接收事务的处理类型
*/
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
String content = (String) msg.obj;
if (mEventFragment == null) {
mEventFragment = new EventFragment();
mEventFragment.setHandler(mHandler);
mEventFragment.setContent(content);
mManager.beginTransaction().add(R.id.id_dialog_content, mEventFragment).commit();
} else {
mEventFragment.setContent(content);
if (!mEventFragment.isAdded()) {
mManager.beginTransaction().add(R.id.id_dialog_content, mEventFragment).show(mEventFragment).commit();
}
}
} else if (msg.what == 2) {
boolean b = (boolean) msg.obj;
if (b) {
if (mMsgs != null) {
mMsgs.clear();
Toast.makeText(FragmentAct.this, "正面处理了当前事务,清空了事务列表", Toast.LENGTH_SHORT).show();
}
if (mEventFragment != null) {
mManager.beginTransaction().remove(mEventFragment).commit();
}
} else {
if (mMsgs.size() != 0) {
if (null != mMsgs.get(0)) {
if (mEventFragment != null) {
mManager.beginTransaction().remove(mEventFragment).commit();
}
Message msgg = mMsgs.get(0);
msgg.what = 1;
sendMessage(msgg);
mMsgs.remove(0);
}
} else {
Toast.makeText(FragmentAct.this, "负面遍历了所有事务", Toast.LENGTH_SHORT).show();
if (mEventFragment != null) {
mManager.beginTransaction().remove(mEventFragment).commit();
}
}
}
}
}
};
}
Fragment代码:
package com.example.sereventdemo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class EventFragment extends Fragment implements View.OnClickListener {
private View rootView;
private Button mBtnPos;
private Button mBtnNeg;
private TextView mTxtContent;
private Handler mHandler;
private String mContent = "这是内容";
public void setHandler(Handler handler) {
this.mHandler = handler;
}
public void setContent(String content) {
this.mContent = content;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.dialog_event, container, false);
init();
return rootView;
}
/**
*
*/
private void init() {
mBtnPos = (Button) rootView.findViewById(R.id.id_btn_pos);
mBtnNeg = (Button) rootView.findViewById(R.id.id_btn_neg);
mTxtContent = (TextView) rootView.findViewById(R.id.id_txt_content);
mBtnPos.setOnClickListener(this);
mBtnNeg.setOnClickListener(this);
mTxtContent.setText(mContent);
mTxtContent.setOnClickListener(this);
}
/**
*
*/
@Override
public void onClick(View v) {
Message msg = null;
switch (v.getId()) {
case R.id.id_btn_pos:
msg = mHandler.obtainMessage(2, true);
mHandler.sendMessage(msg);
break;
case R.id.id_btn_neg:
msg = mHandler.obtainMessage(2, false);
mHandler.sendMessage(msg);
break;
case R.id.id_txt_content:
Toast.makeText(getActivity(), "特么,你点我,你想逆天啊!!!", Toast.LENGTH_SHORT).show();
break;
}
}
}
第一次写博客,这个编辑器什么的东东都还不会用,希望大家见谅了。水平也是菜菜的,有误的地方希望大家多多指正,并希望您能提供宝贵的意见。最后附上博客Demo下载地址:
博客Demo下载