线程注入

来源:互联网 发布:手游源码出售平台 编辑:程序博客网 时间:2024/05/20 07:37
在Android项目开发中用到的一个非常实用的处理业务的方法。记录一下,顺便大家可以一起学习一下。

目的:有多种业务,但是返回的数据格式和展示方式都一样。这样可以让多个线程实现同一个Runnable,在run()中去处理不同的业务。再将不同的线程注入到需要用到该线程的地方使用。下面以项目中应用场景举例。我们需要在手机端实时监测监督员和车辆的实时位置,并在地图上显示。那么获取数据的接口不同,但是返回的数据格式都一样,那么我们可以这么做:

接口:DynamicDataRunnable,线程需要实现的Runnable
public class DynamicDataRunnable implements Runnable {
     public boolean isPause = false;//表示线程是否暂停
     public boolean isStopThread = false;//表示线程是否停止
     public MapShowDataInterface mapShowData = null;//在地图上显示数据接口
     @Override
     public void run() {
     }
}

接口:MapShowDataInterface,通过showData方法,将run()方法中的数据传给地图显示。
public interface MapShowDataInterface {
     public void showData(JSONArray data);
     public Map<String,Object> getMapStatus();
}

具体业务处理线程(实际上还不是线程,只是实现Runnable)

public class SupCarThreadTask extends DynamicDataRunnable {
     public SupCarThreadTask() {
     }

     @Override
     public void run() {
          while (!super.isStopThread) {
               
           ...//省略业务代码,将接口参数解析成地图接受的参数类型通过showdata()传入地图

               if (result.length() > 0 && null != super.mapShowData) {
                    super.mapShowData.showData(result);
               }
               try {
                    Thread.sleep(5000);
               } catch (InterruptedException e) {
                    e.printStackTrace();
               }
          }
     }
}

在进入地图时将该业务线程传入
intent.putExtra("thread", SupCarThreadTask.class.getName());
startActivity(intent);

在地图activity中接受该线程并实例化,启动线程后就等待着数据的到来显示吧

public class SupervisorCarDynDistributionMapActivity extends BaseMap implements
          MapShowDataInterface,IBusinessDataDispose {

     // 动态显示数据
     private String className = "";
     private DynamicDataRunnable baseThread = null;
     private Thread dynThread = null;

     @Override
     protected void init() {
          super.init();
          getDynThread();
     }

     @Override
     protected void onNewIntent(Intent intent) {
          super.onNewIntent(intent);
//        getDynThread();
//        this.showCustomData();
     }

     private void getDynThread() {
          // 获取注入的线程,用于获取动态显示数据
          Intent intent = getIntent();
          className = intent.getExtras().getString("thread");
          if (null != className) {
               Class<DynamicDataRunnable> clazz = null;
               try {
                    clazz = (Class<DynamicDataRunnable>) Class.forName(className);
               } catch (ClassNotFoundException e) {
                    e.printStackTrace();
               }
               if (null != clazz) {
                    try {
                         baseThread = clazz.newInstance();
                    } catch (InstantiationException e) {
                         e.printStackTrace();
                    } catch (IllegalAccessException e) {
                         e.printStackTrace();
                    }
               }
          }
     }

     /**
      * 继承父类方法,用于处理本子类业务; 本子类用于启动获取动态数据的注入线程
      */
     @Override
     protected void showCustomData() {
          super.showCustomData();
          if (null != baseThread) {
               baseThread.mapShowData = SupervisorCarDynDistributionMapActivity.this;
               dynThread = new Thread(baseThread);//此时才是线程的实例化
               dynThread.start();
          }
     }

     @Override
     public void showData(JSONArray strDynset) {
          Message msg = DynHandler.obtainMessage();
          msg.obj = strDynset;
          DynHandler.sendMessage(msg);
     }

     Handler DynHandler = new Handler() {
          public void handleMessage(Message msg) {
               JSONArray strDynset = (JSONArray) msg.obj;
//             showDynOnMap(strDynset);
          };
     };

     @Override
     public Map<String, Object> getMapStatus() {
          return null;
     }

     @Override
     protected void onResume() {
          super.onResume();
          if (baseThread != null && dynThread != null) {
               baseThread.isStopThread = false;
          }
     }

     @Override
     protected void onPause() {
          super.onPause();
          if (baseThread != null && dynThread != null) {
               baseThread.isStopThread = true;
          }
     }

     @Override
     protected void onDestroy() {
          super.onDestroy();
          // 结束动态显示获取数据线程
          if (dynThread != null && dynThread.isAlive()) {
               baseThread.mapShowData = null;
               baseThread.isStopThread = true;
               dynThread.interrupt();
               baseThread = null;
               dynThread = null;
          }
     }

     @Override
     public void onBackPressed() {
          super.onBackPressed();
          if (Alert.isProgressShow()) {
               Alert.progressClose();
          }
     }

     @Override
     public void disposeCalloutData(DynamicPoi dynamicPoi, CallOut callout) {

     }
}
原创粉丝点击