NullPointerException Ошибки контекста в коде, перемещенном из одного рабочего источника в главное приложение - PullRequest
0 голосов
/ 10 июля 2020

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

Итак, я получаю следующую ошибку:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.app, PID: 12564
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
        at androidx.localbroadcastmanager.content.LocalBroadcastManager.getInstance(LocalBroadcastManager.java:107)
        at com.app.TManager.startUpdatingTrace(TManager.java:229)
        at com.app.activities.ui.routeaction.RouteActionFragment$2.onFinish(RouteActionFragment.java:128)
        at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:127)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Итак, это соответствующий код в TManager :

public class TManager extends AppCompatActivity implements Serializable {

    
    BroadcastReceiver sensorReceiver;
    BroadcastReceiver locationReceiver;
    ExecutorService executorService = Executors.newFixedThreadPool(20);
    public static Intent locationIntent;
    public static Intent sensorService;
    public LocalBroadcastManager localBroadcastManager;

    public static MutableLiveData<Integer> status = new MutableLiveData<Integer>();

    //Empty constructor
    public TManager(){}

    @RequiresApi(api = Build.VERSION_CODES.O)
    public void startUpdating() {

        status.setValue(0);

        //register for sensorBroadcast
        sensorReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                TCIMUEvent tcimuEvent = (TCIMUEvent) intent.getSerializableExtra("imuevent");
                // Log.d(TAG, "In Motion Received "+ tcimuEvent.getTime());
                Runnable provideDM = new Runnable() {
                    @Override
                    public void run() {
                        //traceCWrapper.provideDeviceMotion(tcimuEvent, Status, 0, RotationMode.Undetermined);
                    }
                };
                executorService.execute(provideDM);

            }
        };
        localBroadcastManager.getInstance(MyApplication.getAppContext()).registerReceiver(
                sensorReceiver, new IntentFilter("imuCreated")
        );

        //register for locationBroadcast
        locationReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                TCLocationEvent tcLocationEvent = (TCLocationEvent) intent.getSerializableExtra("locationevent");
                Runnable provideLoc = new Runnable() {
                    @Override
                    public void run() {
                traceCWrapper.provideLocation(tcLocationEvent);
                    }
                };
                executorService.execute(provideLoc);
            }
        };
        LocalBroadcastManager.getInstance(context).registerReceiver( //Error Here <-----
                locationReceiver, new IntentFilter("locationCreated")
        );


        isRunning = true;

        //Start the Services

        AsyncTask as1 = new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] objects) {
                startUpdatingLocation();
                return null;
            }
        }.execute();

        AsyncTask as2 = new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] objects) {
                startUpdatingSensors();
                return null;
            }
        }.execute();
       
    }
    }

Это всего лишь один пример. Я продолжаю получать эти ошибки на протяжении всего кода, который был скопирован в другом примере ошибки:

    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.AssetManager android.content.Context.getAssets()' on a null object reference

Кажется, это особенно важно там, где используется

MyApplication.getAppContext......

MyApplication просто возвращается, как показано ниже:

public class MyApplication extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MyApplication.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return MyApplication.context;
    }

}

Как решить эти проблемы? Все классы были перемещены, это не код, взятый из одного класса, перенесенный в другой. Так что не знаю, почему контекст должен был измениться.

1 Ответ

0 голосов
/ 10 июля 2020

Поскольку я использовал класс контекста MyApplication stati c в некоторых местах, мне нужно было добавить эту строку в мой файл манифеста в теге

android:name="com.yourapp.app.yourapp.MyApplication"

и убедиться, что класс приложения помещен в верхний уровень main / java / com.yourapp.app.yourapp /

Это сработало для меня и решило проблему во всем приложении. Я бы обратил внимание на сделанные комментарии, так как это, возможно, не лучший способ использования Context, однако на данный момент это решило мою проблему.

...