Android 恢复片段时出现NullPointerException
我在ViewPager中有两个片段。这些片段具有为WS-Server调用异步的计时器。我在OnResume中停止并恢复计时器,然后在OnPause中停止计时器。有时,在S4智能手机中,我会出现以下错误:Android 恢复片段时出现NullPointerException,android,nullpointerexception,fragment,Android,Nullpointerexception,Fragment,我在ViewPager中有两个片段。这些片段具有为WS-Server调用异步的计时器。我在OnResume中停止并恢复计时器,然后在OnPause中停止计时器。有时,在S4智能手机中,我会出现以下错误: java.lang.NullPointerException at futbol.app.fragment.FragmentUsuariosConectados$3.run(FragmentUsuariosConectados.java:220) at and
java.lang.NullPointerException
at futbol.app.fragment.FragmentUsuariosConectados$3.run(FragmentUsuariosConectados.java:220)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5293)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
这些是日志中报告的行,它们位于tvRegistrados.post中:
Line 219: BitmapDrawable bitmapDrawable = convertViewToDrawable(
Line 220: getActivity(), tvRegistrados);
这是我的整个片段类
public class FragmentUsuariosConectados extends Fragment {
private View view = null;
private FragmentActivity activity;
private JSONObject obj;
private Boolean isTimeToPrint;
private Boolean isWsFinished;
private UsuariosConectadosList usuariosList;
private final static int DELAY_TIME = 540000;
private Timer timer;
public FragmentUsuariosConectados newInstance() {
FragmentUsuariosConectados f = new FragmentUsuariosConectados();
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isTimeToPrint = false;
timer = new Timer();
isWsFinished = false;
getFragmentActivity();
}
@Override
public void onPause() {
stopTimer();
super.onPause();
}
@Override
public void onResume() {
resumeTimer();
super.onResume();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_usuarios_conectados,
container, false);
// Realiza una espera, para que al menu lateral le de tiempo de cerrarse
// antes de pintar la pantalla
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
isTimeToPrint = true;
if (isWsFinished && isTimeToPrint) {
onDrawScreen();
Log.e("DELAY", "ENTRA");
}
}
}, Constantes.TIME_DELAY);
return view;
}
public class WSGet extends AsyncTask<String, Integer, Void> {
// URL del ws
private String url;
private WSController ws;
public WSGet(String url) {
this.url = url;
this.ws = new WSController();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected Void doInBackground(String... params) {
Log.i("WSGET", "Chat");
obj = ws.getWS(getActivity(), url);
Gson gson = new Gson();
if (obj != null)
usuariosList = gson.fromJson(obj.toString(),
UsuariosConectadosList.class);
return null;
}
protected void onPostExecute(Void result) {
isWsFinished = true;
if (isWsFinished && isTimeToPrint) {
onDrawScreen();
}
}
}
private void onDrawScreen() {
try {
if (getFragmentActivity() != null && view != null) {
TextView tvCompartir = (TextView) view
.findViewById(R.id.tv_invitar);
tvCompartir.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new CompartirDialog(getActivity()).show();
}
});
if (usuariosList != null && usuariosList.getError() != null
&& usuariosList.getError().getCodError().equals(0)) {
loadUsuarios();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void loadUsuarios() {
UsuariosConectados usuariosConectados = usuariosList.getRespuesta();
final List<Usuario> registradosList = usuariosConectados.getUsuarios();
if (registradosList != null) {
TextView tvNumConectados = (TextView) view
.findViewById(R.id.tv_num_conectados);
tvNumConectados.setText(registradosList.size() + "");
final TextView tvRegistrados = (TextView) view
.findViewById(R.id.usuarios_registrados);
if (!registradosList.isEmpty())
tvRegistrados.setVisibility(View.VISIBLE);
final List<BitmapDrawable> bitmapList = new ArrayList<BitmapDrawable>();
tvRegistrados.post(new Runnable() {
@SuppressWarnings("deprecation")
public void run() {
for (int i = 0; i < registradosList.size(); i++) {
String nick = registradosList.get(i).getNick();
tvRegistrados.setText(nick);
tvRegistrados
.setBackgroundDrawable(getFragmentActivity()
.getResources()
.getDrawable(
R.drawable.shape_bg_usuario_registrado));
try {
BitmapDrawable bitmapDrawable = convertViewToDrawable(
getFragmentActivity(), tvRegistrados);
bitmapList.add(bitmapDrawable);
} catch (Exception e) {
e.printStackTrace();
}
}
SpannableStringBuilder sStringBuilder = new SpannableStringBuilder();
for (int i = 0; i < bitmapList.size(); i++) {
Spannable wordSpan = new SpannableString("1" + " ");
BitmapDrawable bd = bitmapList.get(i);
bd.setBounds(0, 0, (int) (bd.getIntrinsicWidth()),
(int) (bd.getIntrinsicHeight()));
wordSpan.setSpan(new ImageSpan(bd), 0, 1,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
sStringBuilder.append(wordSpan);
}
tvRegistrados.setText(sStringBuilder);
tvRegistrados.setBackgroundColor(getFragmentActivity()
.getResources().getColor(
android.R.color.transparent));
}
});
}
Integer numInvitados = 0;
if (usuariosConectados.getNumInvitados() != null) {
numInvitados = usuariosConectados.getNumInvitados();
}
TextView tvInvitados = (TextView) view
.findViewById(R.id.tv_usuarios_invitados);
tvInvitados.setText(numInvitados.toString());
}
public class WSTimerTask extends TimerTask {
@Override
public void run() {
Log.i("TIMER WS", "EXECUTE");
if (getFragmentActivity() != null) {
// Login periodico del usuario en el chat
Usuario usuario = UtilPreferencias
.getUsuario(getFragmentActivity());
if (usuario != null) {
Usuario registrado = new Usuario();
registrado.setNick(usuario.getNick());
registrado.setPassword(usuario.getPassword());
new WSLogin(registrado).execute();
} else {
Usuario invitado = new Usuario();
String uuid = UtilPreferencias
.getUuid(getFragmentActivity());
invitado.setUuid(uuid);
new WSLogin(invitado).execute();
}
// Obtiene los conectados
new WSGet(Webservices.URL_BASE
+ Webservices.USUARIOS_CONECTADOS
+ futbol.app.constante.Stylo.ID_EQUIPO).execute();
}
}
}
public class WSLogin extends AsyncTask<String, Integer, Void> {
// URL del ws
private String url;
private WSController ws;
private Usuario usuario;
public WSLogin(Usuario usuario) {
this.ws = new WSController();
if (usuario.getNick() != null && !usuario.getNick().equals(""))
this.url = Webservices.URL_BASE + Webservices.USUARIO_LOGIN;
else
this.url = Webservices.URL_BASE + Webservices.USUARIO_INVITADO;
this.usuario = usuario;
this.usuario.setIdEquipo(futbol.app.constante.Stylo.ID_EQUIPO);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected Void doInBackground(String... params) {
Log.i("WSLOGIN", "Login");
obj = ws.postWS(getFragmentActivity(), url, usuario);
return null;
}
protected void onPostExecute(Void result) {
}
}
public static BitmapDrawable convertViewToDrawable(Context context,
View view) {
int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
view.measure(spec, spec);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(),
view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
c.translate(-view.getScrollX(), -view.getScrollY());
view.draw(c);
view.setDrawingCacheEnabled(true);
Bitmap cacheBmp = view.getDrawingCache();
Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true);
view.destroyDrawingCache();
return new BitmapDrawable(context.getResources(), viewBmp);
}
public FragmentActivity getFragmentActivity() {
if (activity == null) {
activity = this.getActivity();
}
return activity;
}
@Override
public void onDestroyView() {
stopTimer();
super.onDestroyView();
}
@Override
public void onDestroy() {
stopTimer();
super.onDestroy();
}
public Timer getTimer() {
return timer;
}
public void stopTimer() {
if (timer != null) {
timer.cancel();
timer.purge();
timer = null;
}
}
public void resumeTimer() {
stopTimer();
if (timer == null) {
timer = new Timer();
// Hace autologin cada 9 min.
timer.scheduleAtFixedRate(new WSTimerTask(), 0, DELAY_TIME);
}
}
}
public类fragmentUsariosconnectados扩展片段{
私有视图=空;
私人碎片活动;
私有JSONObject对象;
私人印刷品;
私有布尔完成;
私人高利贷者,联系高利贷者;
专用最终静态整数延迟时间=540000;
私人定时器;
公共碎片UsariosConnectados newInstance(){
FragmentUsariosConnectados f=新的FragmentUsariosConnectados();
返回f;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
打印=假;
定时器=新定时器();
isWsFinished=false;
getFragmentActivity();
}
@凌驾
公共无效暂停(){
停止计时器();
super.onPause();
}
@凌驾
恢复时公开作废(){
恢复计时器();
super.onResume();
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u usuarios\u conctados,
货柜(虚假);;
//实现这一点,请参见cerrarse tiempo的横向菜单
//潘塔拉平塔酒店
Handler=newhandler();
handler.postDelayed(新的Runnable(){
公开募捐{
打印结果=真;
如果(isWsFinished和打印(&I){
onDrawScreen();
Log.e(“延迟”、“夹带”);
}
}
},康斯坦茨。时间延迟);
返回视图;
}
公共类WSGet扩展异步任务{
//URL del ws
私有字符串url;
专用无线传感器网络控制器;
公共WSGet(字符串url){
this.url=url;
this.ws=新的WSController();
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
受保护的Void doInBackground(字符串…参数){
Log.i(“WSGET”、“Chat”);
obj=ws.getWS(getActivity(),url);
Gson Gson=新的Gson();
如果(obj!=null)
usuariosList=gson.fromJson(obj.toString(),
USUARIOSCONNECTADOSLIST.class);
返回null;
}
受保护的void onPostExecute(void结果){
isWsFinished=true;
如果(isWsFinished和打印(&I){
onDrawScreen();
}
}
}
私有屏幕(){
试一试{
if(getFragmentActivity()!=null&&view!=null){
TextView tvCompartir=(TextView)视图
.findViewById(R.id.tv_invitar);
setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
新建对话框(getActivity()).show();
}
});
if(usuarislist!=null&&usuarislist.getError()!=null
&&UsuarisList.getError().GetCodeError().equals(0)){
loadUsuarios();
}
}
}捕获(例外e){
e、 printStackTrace();
}
}
私有void loadUsuarios(){
UsuariosConectados UsuariosConectados=usuariosList.getRespuesta();
最终列表registordoslist=usuariosconnectados.getUsuarios();
如果(注册列表!=null){
TextView tvNumConectados=(TextView)视图
.findviewbyd(R.id.tv\u num\u conctados);
tvNumConectados.setText(registorDosList.size()+);
最终文本视图TVDOS=(文本视图)视图
.findviewbyd(R.id.usuarios_注册);
如果(!registordoslist.isEmpty())
设置可见性(View.VISIBLE);
最终列表bitmapList=新的ArrayList();
tvRegistrados.post(新的Runnable(){
@抑制警告(“弃用”)
公开募捐{
对于(int i=0;i