HomeBaseFragment 运行时出现空指针异常
Posted
技术标签:
【中文标题】HomeBaseFragment 运行时出现空指针异常【英文标题】:Null Pointer Exception at Run Time in HomeBaseFragment 【发布时间】:2014-02-27 12:47:47 【问题描述】:在运行时发生堆栈跟踪错误,同时在 Fragments 的帮助下开发 Gems 应用程序。这是我的代码..
AppData.java:
public class AppData
private static Context mContext;
private static Typeface typefaceTamil;
private static Typeface typefaceEnglish;
private static Typeface typefaceHindi;
private static Typeface typefaceTitle;
private List<Gallery> galleries;
private List<String> languages;
private String language;
private Map<String, List<Blog>> mapBlog;
private Map<String, List<Audio>> mapAudio;
private Map<String, List<Video>> mapVideo;
private List<Announcement> announcements;
private Map<String,List<Product>> products;
private List<Category> categories;
private boolean isPlaying;
private static int screenWidth;
public static boolean isVideoPlaying=false;
private int screenHeight;
private String magzfiles;
private List<Magzine> magzines;
private static Video liveStreamVideo;
private String blogLang;
private String videoLang;
public AppData(Context context)
mContext = context;
languages = new ArrayList<String>();
addLanguages();
WindowManager windowManager = (WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
mapAudio = new HashMap<String, List<Audio>>();
mapBlog = new HashMap<String, List<Blog>>();
mapVideo = new HashMap<String, List<Video>>();
this.products=new HashMap<String, List<Product>>();
private void addLanguages()
languages.add("English");
languages.add("Tamil");
languages.add("Hindi");
private static void initFontStyles()
typefaceTamil = Typeface.createFromAsset(mContext.getAssets(),
"fonts/tamil_nambi.ttf");
/* typefaceEnglish = Typeface.createFromAsset(mContext.getAssets(),
"fonts/warnock_regular.otf");*/
typefaceEnglish = Typeface.DEFAULT;
typefaceHindi = Typeface.createFromAsset(mContext.getAssets(),
"fonts/vigyapti.ttf");
/* typefaceTitle = Typeface.createFromAsset(mContext.getAssets(),
"fonts/menu_title.ttf");*/
typefaceTitle=Typeface.DEFAULT_BOLD;
public static Typeface getTamilFont()
if (typefaceTamil == null)
initFontStyles();
return typefaceTamil;
public static Typeface getTitleFont()
if (typefaceTitle == null)
initFontStyles();
return typefaceTitle;
public static Typeface getEnglishFont()
if (typefaceEnglish == null)
initFontStyles();
return typefaceEnglish;
public static Typeface getHindiFont()
if (typefaceHindi == null)
initFontStyles();
return typefaceHindi;
public List<String> getlanguages()
return languages;
public void setBlogs(String lnag, List<Blog> blogs)
if (mapBlog == null)
mapBlog = new HashMap<String, List<Blog>>();
mapBlog.put(lnag, blogs);
public List<Gallery> getGalleries()
return galleries;
public void setGalleries(List<Gallery> galleries)
this.galleries = galleries;
public String getLanguage()
return language;
public void setLanguage(String language)
this.language = language;
public List<Blog> getBlogs(String lang)
return mapBlog.get(lang);
public List<Audio> getAudios(String lang)
return mapAudio.get(lang);
public void setAudios(String lang, List<Audio> audios)
if (mapAudio == null)
mapAudio = new HashMap<String, List<Audio>>();
mapAudio.put(lang, audios);
public void setVideos(String lang, List<Video> videos)
if (mapVideo == null)
mapVideo = new HashMap<String, List<Video>>();
mapVideo.put(lang, videos);
public List<Video> getVideos(String lang)
return mapVideo.get(lang);
public static Typeface getTypeFace(String language)
if (language.equalsIgnoreCase("English"))
return getEnglishFont();
else if (language.equalsIgnoreCase("Hindi"))
return getHindiFont();
else if (language.equalsIgnoreCase("Tamil"))
return getTamilFont();
return getEnglishFont();
public void clearData()
if (mapAudio != null)
mapAudio.clear();
if (mapBlog != null)
mapBlog.clear();
if (mapVideo != null)
mapVideo.clear();
if(galleries!=null)
galleries.clear();
if(announcements!=null)
announcements.clear();
if(products!=null)
products.clear();
if(magzines!=null)
magzines.clear();
setBlogLang(null);
setVideoLang(null);
public boolean isPlaying()
return isPlaying;
public void setPlaying(boolean isPlaying)
this.isPlaying = isPlaying;
public List<Announcement> getAnnouncements()
return announcements;
public void setAnnouncements(List<Announcement> announcements)
this.announcements = announcements;
public List<Product> getProducts(String cat)
return products.get(cat);
public void setProducts(String cat,List<Product> products)
if(this.products==null)
this.products=new HashMap<String, List<Product>>();
this.products.put(cat, products);
public List<Category> getCategories()
return categories;
public void setCategories(List<Category> categories)
this.categories = categories;
public static int getScreenWidth()
return screenWidth;
public List<Magzine> getMagzines()
return magzines;
public void setMagzines(List<Magzine> magzines)
this.magzines = magzines;
public void setLiveStreamVideo(Video video)
liveStreamVideo=video;
public Video getLiveStreamVideo()
return liveStreamVideo;
public void setBlogLang(String lang)
blogLang=lang;
public String getBlogLang()
return blogLang;
public static boolean isAudioAvalableinSD(String title)
String path ="";
try
path = getPath(title);
if(path==null)
return false;
catch (Exception e)
return false;
try
File f = new File(path);
if (!f.exists())
return false;
catch (Exception e)
return false;
return true;
public static String getPath(String title) throws Exception
final String cachePath =
Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
!isExternalStorageRemovable() ? getExternalCacheDir(mContext).getPath() :
mContext.getCacheDir().getPath();
return cachePath+ File.separator +title.trim() + ".mp3";
public static File getExternalCacheDir(Context context)
if (Utils.hasFroyo())
return context.getExternalCacheDir();
// Before Froyo we need to construct the external cache dir ourselves
final String cacheDir = "/android/data/" + context.getPackageName() + "/cache/";
return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
public static boolean isExternalStorageRemovable()
if (Utils.hasGingerbread())
return Environment.isExternalStorageRemovable();
return true;
public String getVideoLang()
return videoLang;
public void setVideoLang(String videoLang)
this.videoLang = videoLang;
HomeBaseFragment.java:
public class HomeBaseFragment extends BaseFragment implements OnTabChangeListener
private View mRoot;
private TabHost mTabHost;
private int mCurrentTab;
private AudioFragment mAudioFragment;
private LiveStreamFragment liveStreamFragment;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
new GetLiveStreamVideoTask(getActivity()).execute();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
mRoot = inflater.inflate(R.layout.layout_home, null);
mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost);
mAudioFragment = new AudioFragment();
liveStreamFragment = new LiveStreamFragment();
setupTabs();
return mRoot;
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
updateTab("Home", R.id.tab_home);
public class GetLiveStreamVideoTask extends CustomAsyncTask
private String responseString;
public GetLiveStreamVideoTask(Activity activity)
super(activity);
enableLoadingDialog(false);
@Override
public void doTask() throws Exception
responseString = APIServiceHandler
.getData("http://splendor.pro/gemapp/api/livestream.php");
@Override
public void doFinish()
if (responseString != null)
try
JSONObject resposeJsonObject = new JSONObject(
responseString);
int statusCode = resposeJsonObject.optInt("statusCode", 0);
if (statusCode == 200)
JSONArray jsonArray = resposeJsonObject
.getJSONArray("videos");
List<Video> videos = new ArrayList<Video>();
for (int i = 0; i < jsonArray.length(); i++)
Video video = new Video(jsonArray.getJSONObject(i));
videos.add(video);
if(videos.size()>0)
Video video=videos.get(0);
appData.setLiveStreamVideo(video);
catch (Exception e)
private void setupTabs()
mTabHost.setup();
mTabHost.addTab(newTab(getString(R.string.str_home), R.string.str_home,
R.drawable.home_selector, R.id.tab_home));
mTabHost.addTab(newTab(getString(R.string.str_video),
R.string.str_video, R.drawable.video_icon_selector,
R.id.tab_video));
mTabHost.addTab(newTab(getString(R.string.str_audio),
R.string.str_audio, R.drawable.audio_icon_selector,
R.id.tab_audio));
mTabHost.addTab(newTab(getString(R.string.str_blog), R.string.str_blog,
R.drawable.blog_icon_selector, R.id.tab_blog));
mTabHost.addTab(newTab(getString(R.string.str_gal), R.string.str_gal,
R.drawable.gal_icon_selector, R.id.tab_gal));
mTabHost.addTab(newTab(getString(R.string.str_more), R.string.str_more,
R.drawable.more_icon_selector, R.id.tab_more));
mTabHost.setOnTabChangedListener(this);
private TabSpec newTab(String tag, int labelId, int tabImg, int tabContentId)
//AppLog.d("TAG", "buildTab(): tag=" + tag);
View indicator = LayoutInflater.from(getActivity()).inflate(
R.layout.tab,
(ViewGroup) mRoot.findViewById(android.R.id.tabs), false);
TextView textView = ((TextView) indicator.findViewById(R.id.tab_text));
textView.setText(labelId);
textView.setTypeface(AppData.getTitleFont());
// textView.setSelected(true);
((ImageView) indicator.findViewById(R.id.tab_img))
.setImageResource(tabImg);
TabSpec tabSpec = mTabHost.newTabSpec(tag);
tabSpec.setIndicator(indicator);
tabSpec.setContent(tabContentId);
return tabSpec;
@Override
public void onTabChanged(String arg0)
if (getString(R.string.str_home).equals(arg0))
updateTab(arg0, R.id.tab_home);
mCurrentTab = 0;
return;
else if (getString(R.string.str_video).equals(arg0))
updateTab(arg0, R.id.tab_video);
mCurrentTab = 1;
return;
else if (getString(R.string.str_audio).equals(arg0))
updateTab(arg0, R.id.tab_audio);
mCurrentTab = 2;
return;
else if (getString(R.string.str_blog).equals(arg0))
updateTab(arg0, R.id.tab_blog);
mCurrentTab = 3;
return;
else if (getString(R.string.str_gal).equals(arg0))
updateTab(arg0, R.id.tab_gal);
mCurrentTab = 4;
return;
else if (getString(R.string.str_more).equals(arg0))
updateTab(arg0, R.id.tab_more);
mCurrentTab = mTabHost.getCurrentTab();
return;
private void updateTab(String tabId, int placeholder)
FragmentManager fm = getFragmentManager();
mAudioFragment.stopPlay(tabId);
if (fm.findFragmentByTag(tabId) == null)
if(AppData.isVideoPlaying && fm.findFragmentById(R.id.tab_video) != null)
fm.popBackStack();
switch (placeholder)
case R.id.tab_home:
fm.beginTransaction()
.replace(placeholder, new HomeFragment(), tabId)
.commit();
break;
case R.id.tab_video:
fm.beginTransaction()
.replace(placeholder, new VideoFragment(), tabId)
.commit();
break;
case R.id.tab_audio:
fm.beginTransaction()
.replace(placeholder, mAudioFragment, tabId).commit();
break;
case R.id.tab_blog:
fm.beginTransaction()
.replace(placeholder, new BlogFragment(), tabId)
.commit();
break;
case R.id.tab_gal:
fm.beginTransaction()
.replace(placeholder, new GalleryFragment(), tabId)
.commit();
break;
case R.id.tab_more:
fm.beginTransaction()
.replace(placeholder, new MoreFragment(), tabId)
.commit();
break;
default:
fm.beginTransaction()
.replace(placeholder, new HomeFragment(), tabId)
.commit();
break;
// if(tabId.equalsIgnoreCase(R.s))
else if (fm.findFragmentByTag(tabId) != null)
if (tabId.equalsIgnoreCase(getString(R.string.str_more)))
fm.popBackStack();
if(AppData.isVideoPlaying && fm.findFragmentById(R.id.tab_video) != null)
fm.popBackStack();
public void OnAudioSelected(Audio audio)
LiveStreamFragment audioDetailFragment = new LiveStreamFragment();
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.tab_audio, audioDetailFragment);
transaction.addToBackStack(null);
transaction.commit();
public void OnBlogSelected(Blog blog,String lang)
BlogDetailFragment blogDetailFragment = new BlogDetailFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("blog", blog);
bundle.putString("lang", lang);
blogDetailFragment.setArguments(bundle);
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.tab_blog, blogDetailFragment);
transaction.addToBackStack(null);
transaction.commit();
public void OnVideoSelected(Video video)
//LiveStreamFragment audioDetailFragment = new LiveStreamFragment();
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
if(video.getVideoType().equalsIgnoreCase("Youtube"))
Intent intent=new Intent(getActivity(),YoutubePlayActivity.class);
intent.putExtra("videoid", video.getVideoUrl());
intent.putExtra("title", video.getVideoTitle());
startActivity(intent);
else
LiveStreamFragment tubePlayFragment=new LiveStreamFragment();
Bundle bundle=new Bundle();
bundle.putString("live","VIDEO");
if(AppData.isAudioAvalableinSD(video.getVideoTitle().trim()))
try
bundle.putString("url", AppData.getPath(video.getVideoTitle().trim()));
catch (Exception e)
bundle.putString("url", video.getVideoUrl());
else
bundle.putString("url", video.getVideoUrl());
tubePlayFragment.setArguments(bundle);
transaction.replace(R.id.tab_video, tubePlayFragment);
transaction.addToBackStack(null);
transaction.commit();
public void onMoreFragmentOptionSelected(final int option)
switch (option)
case 1:
AnnouncenentFragment fragment = new AnnouncenentFragment();
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.tab_more, fragment);
transaction.addToBackStack(null);
transaction.commit();
break;
case 2:
MagzineFragment magzineFragment = new MagzineFragment();
transaction = getActivity().getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.tab_more, magzineFragment);
transaction.addToBackStack(null);
transaction.commit();
break;
case 3:
CategoryFragment categoryFragment = new CategoryFragment();
transaction = getActivity().getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.tab_more, categoryFragment);
transaction.addToBackStack(null);
transaction.commit();
break;
case 4:
LiveStreamFragment liveStreamFragment=new LiveStreamFragment();
Bundle bundle=new Bundle();
bundle.putString("live","LIVE STREAMING");
bundle.putString("url", AppData.getLiveStreamVideo().getVideoUrl());//344th Line
liveStreamFragment.setArguments(bundle);
transaction = getActivity().getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.tab_more, liveStreamFragment);
transaction.addToBackStack(null);
transaction.commit();
break;
case 5:
PrayerRequestFragment prayerRequest = new PrayerRequestFragment();
transaction = getActivity().getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.tab_more, prayerRequest);
transaction.addToBackStack(null);
transaction.commit();
break;
case 6:
SettingsFragment settingsFragment = new SettingsFragment();
transaction = getActivity().getSupportFragmentManager()
.beginTransaction();
transaction.replace(R.id.tab_more, settingsFragment);
transaction.addToBackStack(null);
transaction.commit();
break;
default:
break;
public void onAnnouncementSelected(Announcement announcement)
AnnouncenentDetailFragment blogDetailFragment = new AnnouncenentDetailFragment();
Bundle bundle = new Bundle();
bundle.putString("date", announcement.getDate());
bundle.putString("announcement", announcement.getAnnouncement());
bundle.putString("title", announcement.getTitle());
blogDetailFragment.setArguments(bundle);
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.tab_more, blogDetailFragment);
transaction.addToBackStack(null);
transaction.commit();
public void onProductSelected(Product product)
ProductDetailFragment productDetailFragment = new ProductDetailFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("product", product);
productDetailFragment.setArguments(bundle);
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.tab_more, productDetailFragment);
transaction.addToBackStack(null);
transaction.commit();
public void onGalItemSelected(String pos,String name)
GalleryDetailFragment productDetailFragment = new GalleryDetailFragment();
Bundle bundle = new Bundle();
bundle.putString("id", pos);
bundle.putString("name", name);
productDetailFragment.setArguments(bundle);
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.tab_gal, productDetailFragment);
transaction.addToBackStack(null);
transaction.commit();
public void onInquirytSelected(Product product)
InquiryFragment productDetailFragment = new InquiryFragment();
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
Bundle bundle=new Bundle();
bundle.putParcelable("product",product);
productDetailFragment.setArguments(bundle);
transaction.replace(R.id.tab_more, productDetailFragment);
transaction.addToBackStack(null);
transaction.commit();
public void oncategorySelected(String id,String name)
ProductFragment productFragment = new ProductFragment();
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
Bundle bundle=new Bundle();
bundle.putString("id",id);
bundle.putString("name", name);
productFragment.setArguments(bundle);
transaction.replace(R.id.tab_more, productFragment);
transaction.addToBackStack(null);
transaction.commit();
public void onMagzineSelected(Magzine magzine)
MagazineDetailFragment detailFragment=new MagazineDetailFragment();
FragmentTransaction transaction = getActivity()
.getSupportFragmentManager().beginTransaction();
Bundle bundle=new Bundle();
bundle.putString("url",magzine.getMagzfiles());
bundle.putString("title",magzine.getContent());
detailFragment.setArguments(bundle);
transaction.replace(R.id.tab_more, detailFragment);
transaction.addToBackStack(null);
transaction.commit();
Video.java:
public class Video
private int videoId;
private String videoType;
private String language;
private String date;
public String videoUrl;
private String videoTitle;
public Video(JSONObject jsonObject)
setVideoId(jsonObject.optInt("videoid", 0));
setVideoType(jsonObject.optString("video_type", null));
setLanguage(jsonObject.optString("language", null));
setDate(jsonObject.optString("date", null));
if(getVideoType().equalsIgnoreCase("Youtube"))
setVideoUrl(jsonObject.optString("video_url", null));
else
setVideoUrl(jsonObject.optString("video_file", null));
setVideoTitle(jsonObject.optString("video_title", null));
public int getVideoId()
return videoId;
public void setVideoId(int videoId)
this.videoId = videoId;
public String getVideoType()
return videoType;
public void setVideoType(String videoType)
this.videoType = videoType;
public String getLanguage()
return language;
public void setLanguage(String language)
this.language = language;
public String getDate()
return date;
public void setDate(String date)
this.date = date;
public String getVideoUrl()
return videoUrl;
public void setVideoUrl(String videoUrl)
this.videoUrl = videoUrl;
public String getVideoTitle()
return videoTitle;
public void setVideoTitle(String videoTitle)
this.videoTitle = videoTitle;
堆栈跟踪:
D/AndroidRuntime(973): Shutting down VM
W/dalvikvm(973): threadid=1: thread exiting with uncaught exception (group=0xb3b0fba8)
E/AndroidRuntime(973): FATAL EXCEPTION: main
E/AndroidRuntime(973): Process: com.gems.android, PID: 973
E/AndroidRuntime(973): java.lang.NullPointerException
E/AndroidRuntime(973): at com.sit.gems.frgment.HomeBaseFragment.onMoreFragmentOptionSelected(HomeBaseFragment.java:344)
我在HomeBaseFragment.java中提到了第344行。我是
花费大量时间来解决这些问题。
但我找不到它。如果有人知道如何解决这些问题
错误类型。
这里非常欢迎您的回答。谢谢!
【问题讨论】:
Gems App - Live Stream Fragment的可能重复 【参考方案1】:在您的HomeBaseFragment.GetLiveStreamVideoTask.doFinish()
上,您的appData.setLiveStreamVideo
可能没有被调用,因此getLiveStreamVideo()
可以返回一个可能导致NPE 的空值
if(videos.size()>0)
Video video=videos.get(0);
appData.setLiveStreamVideo(video);
如果用户在加载完成之前尝试访问此代码,它也可以为 null。
【讨论】:
我以为你只是解释为什么会发生空指针异常。你能解决空指针异常并作为答案发布。谢谢 只需将 if(AppData.getLiveStreamVideo() != null) 放在正确的位置。注意你的 GetLiveStreamVideoTask,你没有日志告诉你在 AsyncTask 期间发生了什么,你应该多记录一下并做一些测试 我会尽快告诉你 而不是这些 if (responseString != null) 我只是更改为 if(AppData.getLiveStreamVideo() != null) 但现在我仍然遇到同样的错误 而不是这些 if(videos.size()>0) 我只是改为 if(AppData.getLiveStreamVideo() != null) 。现在仍然发生同样的错误以上是关于HomeBaseFragment 运行时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章