1

我想在用户单击我的 PreferenceActivity 中的 CheckBoxPreference 后立即显示 Toast。

myCheckBox.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(Prefs.this,
                        "test",
                        Toast.LENGTH_SHORT).show();
                doSomething();
                return false;
            }
        });

我也尝试将 Toast 放入 doSomething() 方法中,但它总是整个方法处理完毕后显示。我试过getBaseContext()代替Prefs.this,但没有帮助。知道为什么 Toast 没有立即出现以及如何让它出现吗?

4

2 回答 2

3

发生这种情况是因为onPreferenceClick侦听器正在 UI 线程中运行。该线程也与处理显示Toast. Toast#show仅将消息推送到消息队列中,然后运行代码以进行Toast显示。onPreferenceClick在您的处理程序完全完成之前,不会处理该队列。

你可以试试:

myCheckBox.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                Toast.makeText(Prefs.this,
                        "test",
                        Toast.LENGTH_SHORT).show();

                Prefs.this.runOnUiThread(new Runnable() {
                    @Override
                        public void run() {
                            doSomething();
                        }
                    });
                return false;
            }
    });

这将导致Toast发布到消息队列,然后您doSomething也将在敬酒之后发布到队列中。doSomething这样做的缺点是在调用之前可能会处理一些 UI 消息。此外,如果doSomething长时间运行,它将垄断您的 UI 线程并可能导致 ANR 强制关闭。如果需要超过 150 毫秒左右doSomething,您可能需要考虑运行。AsyncTask

于 2010-08-29T18:49:35.733 回答
0

我的解决方案是使用广播,并在 android manifest 中注册一个接收器。

在 AndroidManifest 中:

    <receiver android:name=".MyReceiver" >
        <intent-filter >
            <action android:name="showtoast" />
        </intent-filter>
    </receiver>

发送广播:

public static void BroadcastMessage(Context context, Bundle extra)
{
    Intent intent = new Intent();
    intent.setPackage(context.getPackageName());
    intent.setAction("showtoast");
    if (extra != null)
        intent.putExtras(extra);
    context.sendBroadcast(intent);
}

接收器如下:

public class MyReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if ("showtoast".equalsIgnoreCase(intent.getAction()) && (bundle != null)
        {
            String title = bundle.getString("title", "");

            View view;
            TextView mTextView;
            LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.my_toast_layout, null);
            mTextView = (TextView) view.findViewById(R.id.tv_title);
            mTextView.setText(title);

            Toast toast = new Toast(context.getApplicationContext());
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.setView(view);
            toast.setDuration(Toast.LENGTH_LONG);
            toast.show();
        }
    }
}
于 2016-05-05T07:17:55.107 回答