去除吐司,也破坏或强制停止线程

时间:2012-02-13 11:19:42

标签: android thread-safety

嗨我正在制作自定义吐司,我能够做到这一点,但是当我移动到下一个活动后,线程正在运行或激活后台活动,那么我应该怎样做才能删除该线程或停止此线程

我的代码如下:

public void customToast(int x, int y, String str) {
    if (Util.tipson == true) {
        toast = new Toast(getApplicationContext());
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP, x, y);
        LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        toastView = li.inflate(R.layout.toastlayout, null);
        toast.setView(toastView);
        TextView text = (TextView) toastView.findViewById(R.id.text);
        text.setText(str);
        // toast.show();

        fireLongToast();
    }

}

private void fireLongToast() {

    t = new Thread() {
        public void run() {
            int count = 0;
            try {
                while (true && count < 40) {
                    try {
                        toast.show();
                        sleep(100);
                        count++;
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    // do some logic that breaks out of the while loop
                }

                toast = null;
                toastView = null;
            } catch (Exception e) {
                Log.e("LongToast", "", e);
            }
        }
    };
    t.start();
}

5 个答案:

答案 0 :(得分:1)

你需要自己停止你的线程。由于java不允许你使用stop()函数。

为此线程编写类

public class YourThread extends Thread {
        private volatile boolean stopped = false;

        public void run() {
            int count = 0;
            try {
                while (true && count < 40 && !stopped) {
                    try {
                        toast.show();
                        sleep(100);
                        count++;
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    // do some logic that breaks out of the while loop
                }

                toast = null;
                toastView = null;
            } catch (Exception e) {
                Log.e("LongToast", "", e);
            }
        }

        public void stopThread() {
            stopped = true;
        }
    }

现在,具有线程完成的活动将停止您的线程

@Override
protected void onDestroy() {
   if(isFinishing())
      yourThreadVariable.stopThread();
}

答案 1 :(得分:0)

finishing活动有效吗?

答案 2 :(得分:0)

不确定,但您可以在活动的join中调用thread的{​​{1}}函数。

答案 3 :(得分:0)

要停止线程,您只需使用interrupt()即可。但为了更好的解决方案,我会说不要使用Thread。只需使用Handler创建Runnable并使用Runnable管理您的Handler,这将是一个很好的方式,因为Android已经为Handler管理了一个或多个Runnables { {1}}。

创建可运行的

Runnable runnable = new Runnable() {

        @Override
        public void run() {
            // put your code stuff here
        }
    };

启动Runnable使用

handler.postDelayed(runnable, your_time_in_millis);

停止使用Runnable

handler.removeCallbacks(runnable);

答案 4 :(得分:0)

我也想建议Lalit Poptani方法并实现这个:

protected void onStop(){
   handler.removeCallbacks(runnable);
   super.onStop();
}

该方法的文档:

  

onStop,当活动不再对用户可见时调用,因为另一个活动已恢复并且正在覆盖此活动。这可能是因为正在开始新活动,现有活动被带到这个活动之前,或者这个活动正在被销毁。   http://developer.android.com/reference/android/app/Activity.html