Почему приложение выбрасывает NoSuchMethodError

У меня есть ProgressBar который вызывает другую функцию при изменении, но время от времени мое приложение падает и бросает NoSuchMethodError . Я включаю в себя мой неполный код, а также трассировку стека, чтобы помочь мне устранить эту проблему.

Мой частичный код Java:

 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { ShowText(); switch(seekBar.getId()) { case R.id.syst_bar: ShowText(); progress = progress + 70; tvSVal.setText(String.valueOf(progress)); if (progress == 70) { tvSOne.setTextColor(Color.parseColor("#4E9CD2")); tvSTwo.setTextColor(Color.WHITE); } else if (progress == 190) { tvSOne.setTextColor(Color.WHITE); tvSTwo.setTextColor(Color.parseColor("#4E9CD2")); } else { tvSOne.setTextColor(Color.WHITE); tvSTwo.setTextColor(Color.WHITE); } break; case R.id.dias_bar: ShowText(); progress = progress + 40; tvDVal.setText(String.valueOf(progress)); if (progress == 40) { tvDOne.setTextColor(Color.parseColor("#4E9CD2")); tvDTwo.setTextColor(Color.WHITE); } else if (progress == 100) { tvDOne.setTextColor(Color.WHITE); tvDTwo.setTextColor(Color.parseColor("#4E9CD2")); } else { tvDOne.setTextColor(Color.WHITE); tvDTwo.setTextColor(Color.WHITE); } break; default: break; } } public void ShowText() { int inOne = sbSyst.getProgress() + 70; int inTwo = sbDias.getProgress() + 40; Log.i("SYSTOLIC SHOWTEXT", String.valueOf(inOne)); Log.i("DIASTOLIC SHOWTEXT", String.valueOf(inTwo)); if ((inOne >= 70 && inOne <= 90) && (inTwo >= 40 && inTwo <= 60)) { tvRes.setText("LOW"); tvRes.setBackgroundColor(Color.parseColor("#73539E")); tvSVal.setBackground(getResources().getDrawable(R.drawable.lowtextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.lowtextpress)); } if ((inOne >= 70 && inOne <= 90) && (inTwo >= 61 && inTwo <= 80)) { tvRes.setText("IDEAL"); tvRes.setBackgroundColor(Color.parseColor("#679800")); tvSVal.setBackground(getResources().getDrawable(R.drawable.idealtextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.idealtextpress)); } if ((inOne >= 70 && inOne <= 90) && (inTwo >= 81 && inTwo <= 90)) { tvRes.setText("PRE-HIGH"); tvRes.setBackgroundColor(Color.parseColor("#967400")); tvSVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); } if ((inOne >= 70 && inOne <= 90) && (inTwo >= 91 && inTwo <= 100)) { tvRes.setText("HIGH"); tvRes.setBackgroundColor(Color.parseColor("#960000")); tvSVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); } if ((inOne >= 91 && inOne <= 120) && (inTwo >= 40 && inTwo <= 80)) { tvRes.setText("IDEAL"); tvRes.setBackgroundColor(Color.parseColor("#679800")); tvSVal.setBackground(getResources().getDrawable(R.drawable.idealtextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.idealtextpress)); } if ((inOne >= 91 && inOne <= 120) && (inTwo >= 81 && inTwo <= 90)) { tvRes.setText("PRE-HIGH"); tvRes.setBackgroundColor(Color.parseColor("#967400")); tvSVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); } if ((inOne >= 91 && inOne <= 120) && (inTwo >= 91 && inTwo <= 100)) { tvRes.setText("HIGH"); tvRes.setBackgroundColor(Color.parseColor("#960000")); tvSVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); } if ((inOne >= 121 && inOne <= 140) && (inTwo >= 40 && inTwo <= 90)) { tvRes.setText("PRE-HIGH"); tvRes.setBackgroundColor(Color.parseColor("#967400")); tvSVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.prehightextpress)); } if ((inOne >= 121 && inOne <= 140) && (inTwo >= 91 && inTwo <= 100)) { tvRes.setText("HIGH"); tvRes.setBackgroundColor(Color.parseColor("#960000")); tvSVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); } if ((inOne >= 141 && inOne <= 190) && (inTwo >= 40 && inTwo <= 100)) { tvRes.setText("HIGH"); tvRes.setBackgroundColor(Color.parseColor("#960000")); tvSVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); tvDVal.setBackground(getResources().getDrawable(R.drawable.hightextpress)); } } 

Мой LogCat :

 java.lang.NoSuchMethodError: android.widget.TextView.setBackground at com.sikni8.bloodpressurelite.MainActivity.ShowText(MainActivity.java:231) at com.sikni8.bloodpressurelite.MainActivity.onProgressChanged(MainActivity.java:171) at android.widget.SeekBar.onProgressRefresh(SeekBar.java:89) at android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:609) at android.widget.ProgressBar.refreshProgress(ProgressBar.java:621) at android.widget.ProgressBar.setProgress(ProgressBar.java:670) at android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:411) at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:342) at android.view.View.dispatchTouchEvent(View.java:5553) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2019) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1712) at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1930) at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1389) at android.app.Activity.dispatchTouchEvent(Activity.java:2378) at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1878) at android.view.View.dispatchPointerEvent(View.java:5733) at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3104) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2666) at android.view.ViewRootImpl.processInputEvents(ViewRootImpl.java:900) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2675) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:4624) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576) at dalvik.system.NativeStart.main(Native Method) 

Как я могу изменить код, чтобы он не генерировал исключение или не имел лучшего метода обработки ошибок?

Вместо этого используйте TextView.setBackgroundResource(int) и передайте ему идентификатор ресурса, например:

 tvRes.setBackgroundColor(Color.parseColor("#73539E")); tvSVal.setBackgroundResource(R.drawable.lowtextpress); tvDVal.setBackgroundResource(R.drawable.lowtextpress); 

Не знаю, откуда возникла странная ошибка, но это лучшее решение в любом случае.

SetBackground () может использоваться только для уровня api 16 и выше. Используйте setBackgroundDrawable (), как я думаю, в вашем случае уровень api установлен ниже 16.

Телефон с уровнем api ниже 16, они будут поддерживать

 setBackgroundDrawable() 

ИЛИ вы можете сделать это:

 if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN ) { myTextView.setBackground(d); } else { myTextView.setBackgroundDrawable(d); } 

Для NoSuchMethodError есть два сценария общих NoSuchMethodError :

1) API-метод / с, который вы использовали в своем коде, отличается от версии jar версии времени выполнения

2) Jar (X), который вы использовали, имеет зависимость от Jar (Y) -> Но у вас есть несовместимый Jar (Y) во время выполнения.

РЕДАКТИРОВАТЬ:

Для # 1 как я могу это предотвратить?

Это легко обрабатывается, добавьте jar в lib и добавьте тот же jar в путь компилятора (добавьте раздел библиотеки, если eclipse)

Для №2 почему это происходит?

Это происходит, если вы загрузили Jar X, который, в свою очередь, требует jar Y, так что вы пойдете в Интернет и загрузите, но не волнует, какая версия Y совместима с X.

Как мы можем предотвратить этот случай? Прочтите readme.txt из Jar X и загрузите поддерживаемую версию Y.

Любой способ предотвратить оба?

Для этого нет пулевого ответа, вам нужно правильно прочитать документацию, а не просто загрузить и поместить в путь к классам.