0

Когда я использую этот код:Как получить доступ к MainActivity findViewById изнутри метода приема радиопередатчика onReceive?

@Override 
public void onReceive(Context context, Intent intent) { 

    seconds += 0.1; 

    if (seconds > 59.9) { 
     seconds=0; 
     minutes++; 
    } 

    TextView tv = (TextView)((MainActivity)context).findViewById(R.id.txtChron); 
    tv.setText (String.valueOf(minutes) + ":" + String.valueOf(seconds)); 
} 

Я получаю сообщение об ошибке при попытке бросить контекст MainActivity.

Здесь ошибка/трассировки стека:

Е/AndroidRuntime: неустранимым: Основной процесс: com.example.jordanbleu.lab8chronservjordanbleu, ПИД: 22693 java.lang.RuntimeException: Ошибка приема широковещательной передачи Намерение { акт = com.example.jordanbleu.lab8chronservjordanbleu.MY_TIME_TICK FLG = 0x10} в com[email protected]d9365fe на android.app.LoadedApk $ ReceiverDispatcher $ Args.run (LoadedApk.java : 1132) на android.o s.Handler.handleCallback (Handler.java:751) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:154) на android.app. ActivityThread.main (ActivityThread.java:6119) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) at com .android.internal.os.ZygoteInit.main (ZygoteInit.java:776) Вызвано : java.lang.ClassCastException: android.app.Application не может быть cast to com.example.jordanbleu.lab8chronservjordanbleu.MainActivity at com. example.jordanbleu.lab8chronservjordanbleu.ChronometerReceiver.onReceive (ChronometerReceiver.java:41) at android.app.LoadedApk $ ReceiverDispatcher $ Args.run (LoadedApk.java:1122) на android.os.Handler.handleCallback (Handler.java:751) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:154) на android.app.ActivityThread.main (ActivityThread.java:6119) на java.lang.reflect.Method.invoke (собственный метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:886) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:776)

Так у меня есть MainActivity, который начинает обслуживание. Служба создает новый поток, и этот поток постоянно создает неявные намерения, которые обрабатываются BroadcastReceiver. Этот широковещательный приемник обновит часы и обновит TextView в макете с обновленным временем. Но когда я пытаюсь получить доступ к findViewByID через параметр контекста, я получаю ошибку выше.

ответ

0

Инициализация TextView внутри функции onCreate вашего Activity.

TextView tv = (TextView) findViewById(R.id.txtChron); 

Затем в onReceive функции

@Override 
public void onReceive(Context context, Intent intent) { 
    seconds += 0.1; 
    if (seconds > 59.9) { 
     seconds=0; 
     minutes++; 
    } 

    tv.setText(String.valueOf(minutes) + ":" + String.valueOf(seconds)); 
} 
0

Ваша ошибка:

java.lang.ClassCastException: android.app.Application не может быть приведен к com.example.jordanbleu. lab8chronservjordanbleu.MainActivity

Это означает, что контекст контекста - это приложение, а не MainActivity.

Мое предложение - раздуть свой TextView в OnCreate.

TextView tv; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    tv = (TextView) findViewById(R.id.txtChron); // This! 
... 
} 

@Override 
public void onReceive(Context context, Intent intent) { 

    seconds += 0.1; 

    if (seconds > 59.9) { 
     seconds=0; 
     minutes++; 
    } 

    tv.setText (String.valueOf(minutes) + ":" + String.valueOf(seconds)); 
}