概述
在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) {
}
}
最后
以上就是神勇热狗为你收集整理的线程注入的全部内容,希望文章能够帮你解决线程注入所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复