在上学期(大三),实验室老师给我们一个小项目,做一个手机购物的客户端,我负责写服务器,服务器采用ssh+jpa,返回json数据给客户端。但是负责写Client的童鞋他们没有太给力,于是,我又抱着练习的心态去写Client。唉,往事已矣,老师说这个项目是个练习项目...结果,我们就没有练习下去了,只做了一个半成品。逝者如斯夫,不舍昼夜,这里是为了纪念那些日子和当时用到的开发模式。
1.有一些程序截图,UI是我的大问题啊。
2.采用mvc模式,处理Client业务与UI更新。画不来图,直接上代码理解。
⑴定义一个IMActivity接口,声明两个抽象方法,项目中与UI有关的activity都要implements该接口
public abstract void init();//实现数据初始化
public abstract void refresh(Object ... param);//当获取到网络数据后,更新UI.
⑵开发一个业务处理中心,一个后台Service。功能为获取网络数据,处理线程通信,发送更新UI的消息对象。
⑶定义一个任务bean,用于新建任务,任务类型:用户登录,获取产品类别,获取产品等等。
⑷UI设计
⑸获取网络json数据的辅助类
3.具体代码过程
⑴根据不同的层的功能,建立程序包结构。
⑵activity接口
package com.mpros.service.model; /*** * 本系统的所有activity父接口,实现activity初始化和Ui更新 * @author Scherrer * */ public interface IMActivity { public abstract void init(); public abstract void refresh(Object ...param); }
⑶Service服务
package com.mpros.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Service; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.graphics.drawable.BitmapDrawable; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import com.mpros.activity.R; import com.mpros.activity.classify.ChildClassifyActivity; import com.mpros.activity.classify.ClassifyActivity; import com.mpros.activity.classify.ProductListActivity; import com.mpros.bean.Task; import com.mpros.bean.product.ProductType; import com.mpros.service.json.ProductTypeService; import com.mpros.service.model.IMActivity; import com.mpros.service.model.ProductAction; import com.mpros.util.HttpUtil; /** * 实现业务调度的核心逻辑服务 */ public class MainService extends Service implements Runnable { // 保存所有的activity public static ArrayList<Activity> allActivities = new ArrayList<Activity>(); // 保存前一个Activity的编号 public static int lastAcvityId; // 所以任务 public static ArrayList<Task> allTasks = new ArrayList<Task>(); // 循环控制变量 private boolean isrun = true; // 保存产品类型logo public static HashMap<Integer, BitmapDrawable> allTypeIcon = new HashMap<Integer, BitmapDrawable>(); // 保存二级分类logo public static HashMap<Integer, BitmapDrawable> allChildTypeIcon = new HashMap<Integer, BitmapDrawable>(); // 保存产品logo public static HashMap<Integer, BitmapDrawable> allProductLogo = new HashMap<Integer, BitmapDrawable>(); //产品的所有样式 //public static HashMap<Integer, ArrayList<BitmapDrawable>> allProductDescImage = new HashMap<Integer, ArrayList<BitmapDrawable>>(); /** * 在集合里,通过name获取Activity对象 * * @param name * @return Activity */ public static Activity getActivityByName(String name) { for (Activity a : allActivities) { if (a.getClass().getName().indexOf(name) >= 0) { return a; } } return null; } /** * 新建任务 * * @param task */ public static void newTask(Task task) { // 添加一个任务 allTasks.add(task); } /********* * 启动线程 */ @Override public void run() { while (isrun) { Task lastTask = null; if (allTasks.size() > 0) { synchronized (allTasks) { // 获取任务 lastTask = allTasks.get(0); // 执行任务 doTask(lastTask); } } // 如果没有任务,则等待2000ms,继续获取任务 try { Thread.sleep(2000); } catch (Exception e) { e.printStackTrace(); } } } /************************ * 很据任务ID,执行该任务 * * @param task */ @SuppressWarnings({ "unchecked", "rawtypes" }) private void doTask(Task task) { Message msg = new Message(); System.out.println("任务编号: " + task.getTaskId()); msg.what = task.getTaskId(); try { switch (task.getTaskId()) { case Task.TASK_GET_PRODUCTTYPE:// 获取产品类型 // 传递消息和数据 List<ProductType> types = ProductTypeService .getTypesFromJson(ProductAction.GET_PRODUCTYPE_ACTION); if (types != null) { if (allTypeIcon == null) { allTypeIcon = new HashMap<Integer, BitmapDrawable>(); } // 获取logo for (ProductType type : types) { BitmapDrawable bd = allTypeIcon.get(type.getTypeid()); if (bd == null) { HashMap param = new HashMap(); param.put("typeid", type.getTypeid()); param.put("typelogo", ProductAction.BASE_ACTION + type.getTypelogo()); Log.i(Task.Logger + type.getTypeid(), ProductAction.BASE_ACTION + type.getTypelogo()); Task tk = new Task(Task.GET_TYPE_LOGO, param); MainService.newTask(tk); } } msg.obj = types; } break; case Task.GET_TYPE_LOGO: Integer typeid = (Integer) task.getTaskParam().get("typeid"); BitmapDrawable drawable = HttpUtil.getImageFromUrl(task .getTaskParam().get("typelogo").toString()); // 添加logo到集合里 allTypeIcon.put(typeid, drawable); break; case Task.TASK_GET_CHILDTYPE_LOGO: Integer childtypeid = (Integer) task.getTaskParam().get( "typeid"); BitmapDrawable childdrawable = HttpUtil.getImageFromUrl(task .getTaskParam().get("typelogo").toString()); // 添加logo到集合里 allChildTypeIcon.put(childtypeid, childdrawable); break; case Task.TASK_GET_PRODUCT_IMAGE: Integer productid = (Integer)task.getTaskParam().get("productid"); BitmapDrawable productlogo = HttpUtil.getImageFromUrl(task.getTaskParam().get("productlogo").toString()); allProductLogo.put(productid, productlogo); break; } } catch (Exception e) { msg.what = -100; e.printStackTrace(); } handler.sendMessage(msg); allTasks.remove(task);// 执行完任务,则移出该任务 } // 当前服务的子线程Handler,负责处理更新UI操作 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.i(Task.Logger, "UI 更新编号:" + msg.what); switch (msg.what) { case Task.TASK_GET_PRODUCTTYPE: IMActivity ia = (ClassifyActivity) getActivityByName("ClassifyActivity"); ia.refresh(ClassifyActivity.GET_TYPE_SUCCESS, msg.obj); case Task.GET_TYPE_LOGO: IMActivity ia1 = (ClassifyActivity) getActivityByName("ClassifyActivity"); ia1.refresh(ClassifyActivity.REFRESH_TYPE_LOGO, msg.obj); break; case Task.TASK_GET_CHILDTYPE_LOGO: IMActivity ia2 = (ChildClassifyActivity) getActivityByName("ChildClassifyActivity"); ia2.refresh(ChildClassifyActivity.REFRESH_CHILDTYPE_LOGO, msg.obj); break; case Task.TASK_GET_PRODUCT_IMAGE: IMActivity ia3 = (ProductListActivity)getActivityByName("ProductListActivity"); ia3.refresh(ProductListActivity.REFRESH_PRODUCT_LOGO); break; } } }; @Override public void onCreate() { super.onCreate(); isrun = true; new Thread(this).start(); } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { super.onDestroy(); isrun = false; } /******************* * 网络连接出错,提示对话框 * * @param context */ public static void alerNetErr(final Context context) { // 对话框 AlertDialog.Builder ab = new AlertDialog.Builder(context); ab.setTitle(R.string.NoRouteToHostException); ab.setMessage(R.string.NoSignalException); // 设置操作对象 ab.setPositiveButton(R.string.apn_is_wrong1_setnet, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 取消对话框 dialog.cancel(); // 打开网络设置Activity Intent it = new Intent( android.provider.Settings.ACTION_WIRELESS_SETTINGS); context.startActivity(it); } }); ab.setNegativeButton(R.string.apn_is_wrong1_exit, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 取消对话框 dialog.cancel(); // 退出程序 // exitApp(context); } }); // 显示 ab.create().show(); } /************************ * 提示对话框 * * @param context */ public static void promptExit(final Context context) { // 通过Inflater对象把布局文件压缩为视图 LayoutInflater flater = LayoutInflater.from(context); View exitView = flater.inflate(R.layout.exitdialog, null); AlertDialog.Builder builder = new AlertDialog.Builder(context); // 改变对话框的默认布局,用已有视图来覆盖 builder.setView(exitView); builder.setPositiveButton(R.string.confirm_exit, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { exitApp(context); } }); builder.setNegativeButton(R.string.apn_is_wrong1_exit, null); // 显示对话框 builder.show(); } /************** * 退出程序 */ public static void exitApp(Context context) { // 出栈所有Activity if (allActivities != null) { for (Activity ac : allActivities) { ac.finish(); } } // 关闭服务 Intent it = new Intent("com.xl.service.MainService"); context.stopService(it); System.exit(0); } }
我要等一分钟了...