Android-AndroidUniversalImageLoader的AsyncTask致命异常



我正在开发一个使用twitter的应用程序,我需要用户配置文件图片。在我的MainActivity中,我使用NavigationDrawerFragment,照片应该在这里,但我不希望在用户登录之前使用抽屉。对于登录,我使用的是TwitterOAuthView。我还使用AndroidUniversalImageLoader加载个人资料照片。这是我如何只在用户登录时使用抽屉,并初始化我希望如何配置图像加载器:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSharedPreferences = getSharedPreferences("MyPref", 0);
connectionDetector = new ConnectionDetector(this);
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisc(true)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.defaultDisplayImageOptions(defaultOptions)
.build();
ImageLoader.getInstance().init(config);
}
@Override
public void onResume() {
super.onResume();
if (isTwitterLoggedInAlready()) {
mNavigationDrawerFragment = (NavigationDrawerFragment)
getFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout));
Fragment fragment;
FragmentManager fragmentManager;
fragment = new MainFragment();
fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, fragment).commit();
}
else {
if(connectionDetector.isConnectingToInternet()){
Fragment fragment;
FragmentManager fragmentManager;
fragment = new LoginFragment();
fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, fragment).commit();
}
else {
Toast.makeText(this, "internet connection required",
Toast.LENGTH_LONG).show();
}
}
}

登录完成后,我以这种方式从推特上获得个人资料图片URL:

private class GetProfilePictureURL extends AsyncTask<String,Integer,Void> {
protected Void doInBackground(String... strings) {
String access_token = strings[0];
String access_token_secret = strings[1];
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
AccessToken accessToken = new AccessToken(access_token,
access_token_secret);
Twitter twitter = new TwitterFactory(builder.build())
.getInstance(accessToken);
try {
User user = twitter.showUser(accessToken.getUserId());
String urldisplay = user.getOriginalProfileImageURL();
SharedPreferences mSharedPreferences = getSharedPreferences("MyPref", 0);
// Shared Preferences
SharedPreferences.Editor e = mSharedPreferences.edit();
e.putString(TwitterKs.PREF_KEY_PICTURE_URL, urldisplay);
e.commit();
} catch (TwitterException e) {
Log.d("Twitter Update Error", e.getMessage());
}
return null;
}
protected void onPostExecute(Long result) {
}
}

所以我把照片的URL保存在SharedPreferences中。当用户登录的"活动"关闭时,在第一个"活动"中调用onResume(),这一次应该创建抽屉。

在抽屉中,获取onCreateView 上的配置文件图片

ImageView pictureImage = (ImageView) insideDrawer.findViewById(R.id.
SharedPreferences mSharedPreferences = getActivity().getSharedPreferences("MyPref",
String urldisplay = mSharedPreferences.getString(TwitterKs.PREF_KEY_PICTURE_URL,"");
Bitmap bitmap = ImageLoader.getInstance().loadImageSync(urldisplay);
pictureImage.setImageBitmap(bitmap);

Bitmap bitmap = ImageLoader.getInstance().loadImageSync(urldisplay);

当我刚启动应用程序时,会给我一个NullPointerException。但这是不可能的,因为我从来没有创造过抽屉!我有点困惑。。。。有什么帮助吗?:(

两个调整:

  1. 加载片段时将调用onCreateView。更新图像的代码应该放在异步方法的"onPostExecute"中。

  2. 建议您在应用程序类中配置ImageLoader,这样您就可以从应用程序中的任何位置调用"getInstance",并且它将是同一个实例。我认为在您的情况下,onCreate中创建的实例在稍后尝试更新时不再存在。请尝试添加应用程序类,然后重试。

最新更新