【问题标题】:Crash upon screen being unlocked屏幕解锁时崩溃
【发布时间】:2013-04-22 13:02:22
【问题描述】:

我的应用程序运行良好,除了当用户停止使用手机足够长的时间以锁定屏幕,当他们解锁它时应用程序崩溃并且我有点不知道为什么。这是错误:

这是惰性适配器:

    package com.buhz.helpers;

import java.util.ArrayList;     
import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


import com.buhz.login.R;
import com.buhz.login.TabHostFragmentActivity;
import com.loopj.android.image.SmartImageView;



public class LazyAdapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader; 

    public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.list_row, null);

        TextView name = (TextView)vi.findViewById(R.id.name); // title
        TextView message = (TextView)vi.findViewById(R.id.message); // artist name
        TextView created = (TextView)vi.findViewById(R.id.created); // duration
        SmartImageView thumb_image = (SmartImageView) vi.findViewById(R.id.list_image);



        HashMap<String, String> update = new HashMap<String, String>();
        update = data.get(position); 

        // Setting all values in listview
        name.setText(update.get("name"));
        message.setText(update.get("message"));
        created.setText(update.get("created"));
        thumb_image.setImageUrl(update.get("thumb_img"));
        name.setOnClickListener(new myOnClickListener(position));
        thumb_image.setOnClickListener(new myOnClickListener(position));
        return vi;
    }

    public class myOnClickListener implements OnClickListener{
        private int position;
        private String clicked_uid;
        public myOnClickListener(int position){
            this.position=position;
        }
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


            HashMap<String, String> update = new HashMap<String, String>();
            update = data.get(position); 
            Log.i("Update Position:", update.toString());
            clicked_uid=update.get("uid");
            Log.d("Clicked UID:", clicked_uid+"");
            Intent i = new Intent(activity.getApplicationContext() , TabHostFragmentActivity.class);
            i.putExtra("profile_uid", clicked_uid);
            activity.startActivity(i);
            activity.finish();

        }

    }
}

【问题讨论】:

  • 从您粘贴的 logcat 来看,似乎在运行 Activity onCreate 之前引发了异常。因此,您的 LazyAdapter 将获得 Activity 的空值。确保您的生命周期事件按顺序触发,并且您没有尝试在正确创建活动之前实例化适配器。
  • 当您说“确保您的生命周期事件按顺序触发”时,您是什么意思...截至目前,我正在使用 FragmentActivity 和片段,我唯一有代码的生命周期方法是 onCreate截至目前。如果我没有实现它们,我会为我处理生命周期方法吗?
  • 我没有说清楚 - 基本上你必须确保你在生命周期中的正确时间实例化 LazyAdapter。

标签: android listview android-lifecycle baseadapter


【解决方案1】:

正如the doc 所说:

When a configuration change occurs at runtime, the activity is shut down 
and restarted by default, but declaring a configuration with this attribute
will prevent the activity from being restarted. 

所以我更改了 AndroidManifest.xml 以包含所有配置。

android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize|layoutDirection"

它对我有用。

【讨论】:

    【解决方案2】:

    您必须通过确保处理所有可能的状态来检查您的应用程序状态。当您的应用程序状态进入未处理状态(如 onResume 或 onStart)时,就会出现此问题。

    本文将帮助您了解每个状态以及何时调用它

    http://www.android-app-market.com/android-activity-lifecycle.html

    【讨论】:

    • 这对于碎片来说没有多大帮助,这就是问题所在。我发现它的 bc 片段由于某种原因比活动 onResume 加载得更快,所以我的活动上下文还没有准备好,我只是不知道该怎么做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多