Android:Package已经发布了50个Toast。没有显示更多。

时间:2018-02-15 11:17:27

标签: java android android-fragments android-activity toast

我正在开发一个应用程序,我正在使用默认的android Toast,在使用一段时间后我收到这样的错误:

Package has already posted 50 toasts. Not showing more. Package=com.synapsica

这是我的一些工作代码:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_opdregistration, container, false);
    ButterKnife.bind(this, view);
    stopProgressBar(progressBar);
    if(mainActivity!=null){
        sharedPreferences = mainActivity.getSharedPreferences(Constants.REGISTRATION_SCREEN_SEARCH, Context.MODE_PRIVATE);
    }


    enterAadharnNumber.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId== EditorInfo.IME_ACTION_DONE){
                mainActivity.hideSoftKeyboard(enterAadharnNumber);
                if(!enterAadharnNumber.getText().toString().isEmpty()){
                    if(enterAadharnNumber.getText().toString().length() == 10 || enterAadharnNumber.getText().toString().length() == 12){
                        progressBar.setVisibility(View.VISIBLE);
                        if(!enterAadharnNumber.getText().toString().isEmpty()){
                            if(enterAadharnNumber.getText().toString().length()==10){
                                Presenter.getInstance().addModel(Constants.SEARCH_PHONE_NUMBER, enterAadharnNumber.getText().toString());
                            }
                        }
                        patientRegistrationActivity.searchPatient(enterAadharnNumber.getText().toString(), "OPD", "search", progressBar);
                    } else{
                        Toast.makeText(patientRegistrationActivity, "Enter valid phoneNumber or aadhar Number", Toast.LENGTH_SHORT).show();
                    }
                } else{
                    Toast.makeText(patientRegistrationActivity, "Enter valid phoneNumber or aadhar Number", Toast.LENGTH_SHORT).show();
                }
            }
            return false;
        }
    });

    return view;
}

2 个答案:

答案 0 :(得分:2)

这似乎是系统施加的限制,请看一下:

https://android.googlesource.com/platform/frameworks/base/+/f76a50c/services/java/com/android/server/NotificationManagerService.java#477

我建议您使用应用内通知(例如,可以SnackBar)来显示您的消息。

答案 1 :(得分:0)

查看NotificationManagerServicehttps://android.googlesource.com/platform/frameworks/base/+/f76a50c/services/java/com/android/server/NotificationManagerService.java)中的代码,看起来Android的吐司入队限制为50.

您应该更新逻辑,而不是经常显示Toast。您可以使用SnackBar,但仍然不会太频繁。

try {
        ToastRecord record;
        int index = indexOfToastLocked(pkg, callback);
        // If it's already in the queue, we update it in place, we don't
        // move it to the end of the queue.
        if (index >= 0) {
            record = mToastQueue.get(index);
            record.update(duration);
        } else {
            // Limit the number of toasts that any given package except the android
            // package can enqueue.  Prevents DOS attacks and deals with leaks.
            if (!"android".equals(pkg)) {
                int count = 0;
                final int N = mToastQueue.size();
                for (int i=0; i<N; i++) {
                     final ToastRecord r = mToastQueue.get(i);
                     if (r.pkg.equals(pkg)) {
                         count++;
                         if (count >= MAX_PACKAGE_NOTIFICATIONS) {
                             Slog.e(TAG, "Package has already posted " + count
                                    + " toasts. Not showing more. Package=" + pkg);
                             return;
                         }
                     }
                }
            }
        .......
        .......