按下主页按钮最小化我的应用程序并在5-10分钟后重新打开它我收到以下错误:
java.lang.NullPointerException
at de.cwalz.betconnection.aq.a(Unknown Source)
at com.a.a.a.k.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4867)
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:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
我覆盖onResume()的唯一一次是在我的基础活动中,我的其他活动来自:
@Override
public void onResume() {
super.onResume();
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
if (status != ConnectionResult.SUCCESS) {
GooglePlayServicesUtil.getErrorDialog(status, this, 9000).show();
}
}
我无法弄清楚问题出在哪里(例外不是那么有用......)。
编辑:我能够对异常进行反混淆处理:java.lang.NullPointerException
at de.cwalz.betconnection.WelcomeActivity$3.onSuccess(Unknown Source)
at com.loopj.android.http.JsonHttpResponseHandler$1$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4867)
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:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
WelcomeActivity.java
public class WelcomeActivity extends ActionBarActivity implements ActionBar.TabListener {
// views
static ListView followingView;
static ListView betView;
// values
static List<Bet> betList = new ArrayList<Bet>();
static List<Bet> followingList = new ArrayList<Bet>();
// adapter
static BetListViewAdapter betAdapter;
static BetListViewAdapter followingAdapter;
// fragments
FollowListFragment followFragment;
BetListFragment betFragment;
// drawer values
protected List<String> mMenuItems;
protected DrawerLayout mDrawerLayout;
protected ListView mDrawerList;
protected ActionBarDrawerToggle mDrawerToggle;
protected CharSequence mTitle;
protected CharSequence mDrawerTitle;
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a {@link FragmentPagerAdapter}
* derivative, which will keep every loaded fragment in memory. If this
* becomes too memory intensive, it may be best to switch to a
* {@link android.support.v4.app.FragmentStatePagerAdapter}.
*/
SectionsPagerAdapter mSectionsPagerAdapter;
/**
* The {@link ViewPager} that will host the section contents.
*/
ViewPager mViewPager;
/**
* The current user
*/
UserHandler user = null;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
// Set up the action bar.
final ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
// When swiping between different sections, select the corresponding
// tab. We can also use ActionBar.Tab#select() to do this if we have
// a reference to the Tab.
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
// For each of the sections in the app, add a tab to the action bar.
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
// Create a tab with text corresponding to the page title defined by
// the adapter. Also specify this Activity object, which implements
// the TabListener interface, as the callback (listener) for when
// this tab is selected.
actionBar.addTab(actionBar.newTab()
.setText(mSectionsPagerAdapter.getPageTitle(i))
.setTabListener(this));
}
// create user object
user = new UserHandler(getApplicationContext());
if (!user.isLoggedIn()) {
Intent loginIntent = new Intent(getApplicationContext(), LoginActivity.class);
startActivity(loginIntent);
}
// set ad for non premium user
if (!user.isPremium()) {
AdHandler.setBannerAd(this, (LinearLayout)findViewById(R.id.adPlaceholder));
}
// check if bet was submitted
String bet = "";
bet = getIntent().getStringExtra(AddBetActivity.EXTRA_BET);
if (bet != null) {
Toast toast = Toast.makeText(getApplicationContext(), bet, Toast.LENGTH_LONG);
toast.show();
}
// check if first login
Boolean firstLogin = getIntent().getBooleanExtra(RegisterActivity.EXTRA_FIRSTLOGIN, false);
if (firstLogin) {
showFirstLoginDialog();
}
// ...
// show progress bars
loadData();
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
betFragment = BetListFragment.getInstance();
return betFragment;
}
else {
followFragment = FollowListFragment.getInstance();
return followFragment;
}
}
@Override
public int getCount() {
// Show 2 total pages.
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
if (position == 0)
return getString(R.string.page_title_bets);
else
return getString(R.string.page_title_following);
}
}
// ...
@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
// When the given tab is selected, switch to the corresponding page in
// the ViewPager.
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabReselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
// ...
public static class BetListFragment extends Fragment {
Context context;
View rootView;
ListView listView;
ProgressBar progressBar;
TextView noBets;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
context = container.getContext();
rootView = inflater.inflate(R.layout.fragment_bet_list, container, false);
listView = (ListView) rootView.findViewById(R.id.betList);
progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar);
noBets = (TextView) rootView.findViewById(R.id.noBets);
betAdapter = new BetListViewAdapter(context, R.layout.listview_bet, betList);
listView.setAdapter(betAdapter);
// set listener
listView.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Bet bet = betAdapter.getItem(position);
Intent betActivity = new Intent(context, BetActivity.class);
betActivity.putExtra("de.cwalz.bet.BETID", bet.getID());
startActivity(betActivity);
}
});
return rootView;
}
public View getRootView() {
return rootView;
}
public void showLoadingView(boolean status) {
if (status) {
listView.setVisibility(View.GONE);
noBets.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
}
else {
listView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
}
}
public BetListFragment() {}
public static BetListFragment getInstance() {
return new BetListFragment();
}
}
public static class FollowListFragment extends Fragment {
Context context;
View rootView;
ListView listView;
ProgressBar progressBar;
TextView noFollowingUsers;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
context = container.getContext();
rootView = inflater.inflate(R.layout.fragment_bet_list, container, false);
listView = (ListView) rootView.findViewById(R.id.betList);
progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar);
noFollowingUsers = (TextView) rootView.findViewById(R.id.noFollowingUsers);
followingAdapter = new BetListViewAdapter(context, R.layout.listview_bet, followingList);
listView.setAdapter(followingAdapter);
// set listener
listView.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Bet bet = followingAdapter.getItem(position);
Intent betActivity = new Intent(context, BetActivity.class);
betActivity.putExtra("de.cwalz.bet.BETID", bet.getID());
startActivity(betActivity);
}
});
return rootView;
}
public View getRootView() {
return rootView;
}
public void showLoadingView(boolean status) {
if (status) {
listView.setVisibility(View.GONE);
noFollowingUsers.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
}
else {
listView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
}
}
public FollowListFragment() {}
public static FollowListFragment getInstance() {
return new FollowListFragment();
}
}
private void loadData() {
RequestParams params = new RequestParams();
String email = user.getEmail();
params.put("email", email);
params.put("password", user.getPassword());
params.put("token", TextUtil.getToken(email));
DataUtil.post("GetBetList", params, new JsonHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
try {
// hide progress bars
betFragment.showLoadingView(false);
followFragment.showLoadingView(false);
JSONArray blist = response.getJSONArray("blist");
JSONArray flist = response.getJSONArray("flist");
// add bets
betList.clear();
for(int i=0; i<blist.length(); i++) {
// ...
}
// add bets from followed users
followingList.clear();
for(int i=0; i<flist.length(); i++) {
// ...
}
if (betList.isEmpty()) {
TextView text = (TextView) betFragment.getRootView().findViewById(R.id.noBets);
text.setVisibility(View.VISIBLE);
}
if (followingList.isEmpty()) {
TextView text = (TextView) followFragment.getRootView().findViewById(R.id.noFollowingUsers);
text.setVisibility(View.VISIBLE);
}
// notify adapter and show listview
betAdapter.notifyDataSetChanged();
followingAdapter.notifyDataSetChanged();
}
catch (JSONException e) {
Log.e("ERROR", e.getMessage());
}
}
});
}
}