一、新建javabean类task
package Bean; import java.util.Map; /**taskId,taskParam * Created by Administrator on 2016/8/23. */ public class Task { //任务Id private int taskId; //参数,用于存放比如用户信息 private Map<String,Object> taskParams; /* 定义了一个私有的Map集合 Map的存放形式为键值对,key-value ,key为String类型,value为Object类型 这个Map只能在本类被访问,因为它有个修饰符private ,私有的 */ public static final int WEIBO_LOGIN=1; public Task(int taskId, Map<String, Object> taskParams) //taskId就是传入的WEIBO_LOGIN,用于Handler的判断case { this.taskId = taskId; this.taskParams = taskParams; } public int getTaskId() { return taskId; } public Map<String, Object> getTaskParams() { return taskParams; } public void setTaskId(int taskId) { this.taskId = taskId; } public void setTaskParams(Map<String, Object> taskParams) { this.taskParams = taskParams; } }
二、新建Service类MainService
/** * 这里我就要讲解真个MainService的各个函数的最用以及创建的先后顺序,继承Service 和Runnable * 1.创建task类,MainService类,IWeiBoActivity接口 * 2.让LoginActivity继承IWeiBoActivity * 1.新建队列对象 private static Queue<Task> tasks=new LinkedList<Task>(); //创建任务队列对象 * 2.创建newTask(Activity activity)类,用于放入一个Activity对象 * 3.在Oncreate()中创建线程Thread()开启 * 4.编写run()函数不停监听队列中的任务,并且执行task(); * 5.编写dotask()处理业务逻辑,根据task的Id执行相应的操作,并且通过message,传送给Handler处理 * 6.编写handler,根据 msg.what来执行相应的操作,更新UI * 7.跟新UIIWeiBoActivity activity= (IWeiBoActivity) getActivityByName("LoginActivity");//根据活动名,获取当前活动对象activity.refresh(msg.obj); * 8.创建ArrayList用于存放活动,管理活动 private static ArrayList<Activity> appActivities=new ArrayList<Activity>();//创建一个Activity集合,用于加入需要更新UI的Activity * 9.编写newActivity() * 10.编写getAppactionName(),用于获取活动的name,表明更新那个活动 * 11. IWeiBoActivity activity= (IWeiBoActivity) getActivityByName("LoginActivity");//根据活动名,获取当前活动对象 activity.refresh(msg.obj); * 12.启动服务,运行 * Intent intent=new Intent(this,MainActivity.class); startService(intent); init(); MainService.newActivity(this); //将对象加入活动队列中 Task task=new Task(Task.WEIBO_LOGIN,null);//创建task对象,一个参数是用途Hnadler,thread的参数,第二个为需要传入的数据,比如用户密码,token等 MainService.newTask(task); /**后台运行,处理数据,顺序MainService启动,再run()开启线程,再UI发出任务new task(task t),之后doTask(Task t)处理业务逻辑,发挥跟新消息给主线程,Hannder()处理消息队列 * 更新UI,refresh(mess) * Created by Administrator on 2016/8/23. */
package Logic; /* 方法的static是为了在别的类中调用,如MainService.newTask(); */ import android.app.Activity; import android.app.Service; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.support.annotation.Nullable; import android.util.Log; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import Bean.Task; import app.coolweather.com.weibo.IWeiBoActivity
/**后台运行,处理数据,顺序MainService启动,再run()开启线程,再UI发出任务new task(task t),之后doTask(Task t)处理业务逻辑,发挥跟新消息给主线程,Hannder()处理消息队列 * 更新UI,refresh(mess) * Created by Administrator on 2016/8/23. */ public class MainService extends Service implements Runnable{ private static Queue<Task> tasks=new LinkedList<Task>(); //创建任务队列对象 private static ArrayList<Activity> appActivities=new ArrayList<Activity>();//创建一个Activity集合,用于加入需要更新UI的Activity private boolean isRun; //是否运行线程 //异步处理 private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case Task.WEIBO_LOGIN: //用户登录 //跟新UI IWeiBoActivity activity= (IWeiBoActivity) getActivityByName("LoginActivity");//根据活动名,获取当前活动对象 activity.refresh(msg.obj); } } }; //添加任务到队列中,添加一个Activity对象 public static void newTask(Task t) { tasks.add(t); } //添加到集合中 public static void newActivity(Activity activity){ appActivities.add(activity); } 根据Activity活动名,获取当前活动对象 public Activity getActivityByName(String name){ if(!appActivities.isEmpty()) { for (Activity activity : appActivities) { if(null != activity) { if(activity.getClass().getName().indexOf(name) >0) { return activity; } } } } return null; } @Override public void onCreate() { super.onCreate(); isRun=true; //因为继承了Runnable,所以直接开启线程不需要再new Runnable(),下面的run(),和这里是同一个线程 Thread thread=new Thread(); thread.start(); } //将任务放在run()中等待处理 @Override public void run() { //不停的去监听队列里面的任务 while(isRun){ Task task = null; if(!tasks.equals("")){ task=tasks.poll();//执行任务后将这个任务从队列中移除,poll() 方法用于检索并移除此队列的头,则返回null,如果此队列为空。 if(task!=null){ doTask(task); } } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } //doTask(Task t)处理业务逻辑 private void doTask(Task t){ // 尽量使用 Message msg = handler.obtainMessage();的形式创建Message.msg.obj = result1; //msg.obj=?从这里把你想传递的数据放进去就行了 Message msg=handler.obtainMessage(); msg.what=t.getTaskId(); switch (t.getTaskId()){ case Task.WEIBO_LOGIN: Log.d("微博登录","_____________>"); msg.obj="登陆成功"; break; default: break; } handler.sendMessage(msg); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }