Android:无法在自定义视图

时间:2016-07-25 10:05:58

标签: android multithreading view timer android-asynctask

我首先说我是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)

那么,我怎样才能破坏这些任务呢?

0 个答案:

没有答案