#android #nullpointerexception #android-emulator
#Android #Исключение nullpointerexception #android-эмулятор
Вопрос:
Приложение может нормально работать на моем реальном устройстве, оно может запускаться и запускаться на эмуляторе, однако, когда я вхожу в систему и использую метод onCreate, он выдает ошибку, как показано ниже. Эмулятор настроен со всеми необходимыми спецификациями, такими как правильный уровень API и разрешенное использование SD-карты для памяти (200 Мбайт). Есть ли какое-либо представление о том, как устранить эту ошибку?
06-24 10:19:53.060: E/AndroidRuntime(625): FATAL EXCEPTION: main
06-24 10:19:53.060: E/AndroidRuntime(625): Process: com.example.bestapp, PID: 625
06-24 10:19:53.060: E/AndroidRuntime(625): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.bestapp/com.example.best.MainActivity}: java.lang.NullPointerException
06-24 10:19:53.060: E/AndroidRuntime(625): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2208)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2270)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.app.ActivityThread.access$800(ActivityThread.java:138)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1209)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.os.Handler.dispatchMessage(Handler.java:102)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.os.Looper.loop(Looper.java:136)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.app.ActivityThread.main(ActivityThread.java:5042)
06-24 10:19:53.060: E/AndroidRuntime(625): at java.lang.reflect.Method.invokeNative(Native Method)
06-24 10:19:53.060: E/AndroidRuntime(625): at java.lang.reflect.Method.invoke(Method.java:515)
06-24 10:19:53.060: E/AndroidRuntime(625): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:776)
06-24 10:19:53.060: E/AndroidRuntime(625): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
06-24 10:19:53.060: E/AndroidRuntime(625): at dalvik.system.NativeStart.main(Native Method)
06-24 10:19:53.060: E/AndroidRuntime(625): Caused by: java.lang.NullPointerException
06-24 10:19:53.060: E/AndroidRuntime(625): at com.example.bestapp.MainActivity.onCreate(MainActivity.java:59)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.app.Activity.performCreate(Activity.java:5231)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
06-24 10:19:53.060: E/AndroidRuntime(625): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2172)
Метод MainActivity onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.pager);
FragmentManager fragmentManager = getSupportFragmentManager();
viewPager.setAdapter(new MyAdapter(fragmentManager));
// Get the location manager
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the location provider -> use
// default
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
Context context;
// Just test displaying
lat = (float) (location.getLatitude());
lng = (float) (location.getLongitude());
// Set up the action bar to show a dropdown list.
final android.app.ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
// Populating the dropdown menu
ArrayList<String> itemList = new ArrayList<String>();
// Get the present day
Calendar calendar = Calendar.getInstance();
int today = calendar.get(Calendar.DAY_OF_WEEK);
itemList.add("Today");
if (today == 2) {
itemList.add("Tues");
itemList.add("Weds");
itemList.add("Thurs");
itemList.add("Fri");
}
if (today == 3) {
itemList.add("Weds");
itemList.add("Thurs");
itemList.add("Fri");
itemList.add("Sat");
}
if (today == 4) {
itemList.add("Thurs");
itemList.add("Fri");
itemList.add("Sat");
itemList.add("Sun");
}
if (today == 5) {
itemList.add("Fri");
itemList.add("Sat");
itemList.add("Sun");
itemList.add("Mon");
}
if (today == 6) {
itemList.add("Sat");
itemList.add("Sun");
itemList.add("Mon");
itemList.add("Tues");
}
if (today == 7) {
itemList.add("Sun");
itemList.add("Mon");
itemList.add("Tues");
itemList.add("Weds");
}
if (today == 1) {
itemList.add("Mon");
itemList.add("Tues");
itemList.add("Weds");
itemList.add("Thurs");
}
ArrayAdapter<String> aAdpt = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1,
itemList) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
TextView text = (TextView) view
.findViewById(android.R.id.text1);
text.setTextColor(Color.WHITE);
return view;
}
};
// Assign list to actionbar
actionBar.setListNavigationCallbacks(aAdpt, null);
}
Комментарии:
1. Местоположение location = LocationManager.getLastKnownLocation(поставщик); getLastKnownLocation может возвращать значение null
2. @blackbelt есть ли улучшенный способ предотвратить присвоение null?
3. какой номер строки 59 в MainActivity.java ?
4. @blackbelt есть ли лучший способ отправить координаты GPS в эмулятор, я использовал DDMS и «отправил» координаты вручную, но, возможно, эмулятор их не получает? Шаги по порядку: запустить приложение в эмуляторе -> отправить координаты-> войти в систему -> сбой приложения. Правильно ли это?
5. @eatlon я знаю, но все равно это не отвечает на его вопрос
Ответ №1:
locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// get last location
Location lastLoc = locMan
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (lastLoc == null) {
lastLoc = locMan
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
double lastlat = lastLoc.getLatitude();
double lastlng = lastLoc.getLongitude();
LatLng lastLatLng = new LatLng(lastlat, lastlng);
// В случае, если вам нужен пример Карт Google
userMarker = map.addMarker(new MarkerOptions().position(lastLatLng)
.title("You are here")
.icon(BitmapDescriptorFactory.fromResource(userIcon))
.snippet("Your last recorded location"));
Комментарии:
1. Ошибка возникает только при запуске на эмуляторе, а не на реальном устройстве. Я отправляю координаты через DDMS, но это все равно не помогает. Предотвратит ли это ваша реализация?
2. Нет, этого не будет. я добавил некоторый код, который работал для моего эмулятора.
3. не могли бы вы добавить обратно код, который у вас был, этот ответ теперь неполный… что в классе LatLng…
4. он добавлен, я использую это для добавления маркеров и увеличения масштаба до текущей позиции (этот код не добавлен) я могу отправить вам весь класс, если хотите, но в чате, так как это длинный код
5. Спасибо, это намного надежнее