我首先说我是Android世界的初学者..
申请结构:
主要活动是带有DrawerLayout和NavigationView的AppCompatActivity。 NavigationView的每个项目都有一个自定义的“OnMenuItemClickListener”,它将使用以下指令选择要调用的片段:
f = new MyFragment();
/*set bundle*/
mFragmentManager = getSupportFragmentManager();
mFragmentTransaction = mFragmentManager.beginTransaction();
mFragmentTransaction.replace(R.id.containerView, f).commit();
有些项目必须调用特定的片段(TableFragment),这将创建(在onCreateView中)一个表,并用一些视图填充它(不同的参数取决于包中的数组,为简单起见,我删除了他们在这里):
TableRow tr;
CustomView cv;
tableLayout.removeAllViews();
for (int a = 0; a < myArray.size(); a=a+3) {
tr = new TableRow(getActivity());
for(int cvn = 0; cvn < 3; cvn++) {
if(a+cvn < myArray.size()) {
cv = new CustomView(getActivity(), myArray.get(a + cvn);
tr.addView(cv);
}
}
tableLayout.addView(tr);
}
我的CustomView包含一个带有ImageView和TextView的FrameLayout。在构造函数中,我创建了一个定时器,它将在固定的时间间隔内调用AsyncTask。
方法#1:
timer = new Timer();
timTask = new TimerTask() {
@Override
public void run() {
asyncTask at = new asyncTask (parameters..);
at.execute("");
}
};
timer.scheduleAtFixedRate(timTask, 10, 500);
方法#2:
ScheduledFuture<?> scheduledFuture = Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {
public void run() {
asyncTask at = new asyncTask(parameters..);
at.execute("");
}
}, 10, 500, TimeUnit.MILLISECONDS);
asyncTask将与plc通信,例如,根据某些信号旋转ImageView(因此我可以简单地知道它是否正常工作)。
我的问题是当我切换到NavigationView的另一个声音然后回到这个片段。表格已正确创建并填充了视图(我可以看到文本),但每次定时器启动时间都会超过之前(图像被创建并稍后开始旋转)。 我想我应该销毁线程,但我无法理解在哪里插入正确的指令来做到这一点。 我试过,例如,在单个ViewDetachedFromWindow()中查看以下说明,显然没有太多结果:
@Override
protected void onDetachedFromWindow() {
timTask.cancel();
timer.cancel();
timer.purge();
this.removeAllViews();
super.onDetachedFromWindow();
}
有什么想法吗?提前谢谢!
更新
似乎我的问题不是计时器而是AsyncTask。 我的桌子上有28个视图,虽然这个片段还活着但我可以看到他们所有的计时器(&#34; Timer-1&#34;,&#34; Timer-2&#34;等),然后当我更改片段时他们消失了。
AsyncTasks总是9(&#34; AsyncTask#1&#34;,&#34; AsyncTask#2&#34;等):
Alive threads when my fragment is running
Alive threads when I change fragment
我已尝试在this.cancel(true)
任务的onPostExecute()
和每个视图的父片段view.asyncTask.cancel(true)
那么,我怎样才能破坏这些任务呢?