【问题标题】:AsyncTask NullPointerException after two rotates with listfragmentAsyncTask NullPointerException 两次后用 listfragment 旋转
【发布时间】:2013-11-28 09:41:24
【问题描述】:

我有一个与 LisFragment 和 ViewPagerIndicator 配合使用的应用程序。当屏幕旋转两次时,应用程序会给出 logcat 附加的错误。 我的问题似乎与上下文相关为空。我在 StackOverflow 上看到了几个问题,但我还没有设法解决它。似乎我必须实现 onAttach 和 onDetach 方法,但不像我尝试过的那样失败。

请你帮帮我。坦率地说,我对这个问题感到绝望。

谢谢。

我的日志猫

11-28 08:30:18.939: E/AndroidRuntime(602): FATAL EXCEPTION: main
11-28 08:30:18.939: E/AndroidRuntime(602): java.lang.NullPointerException
11-28 08:30:18.939: E/AndroidRuntime(602):  at android.widget.ArrayAdapter.init(ArrayAdapter.java:271)
11-28 08:30:18.939: E/AndroidRuntime(602):  at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:150)
11-28 08:30:18.939: E/AndroidRuntime(602):  at es.app.adeptlabel.AdaptadorList.<init>(AdaptadorList.java:27)
11-28 08:30:18.939: E/AndroidRuntime(602):  at es.app.adeptlabel.ArtFragment$CreateArrayListTaskArt.onPostExecute(ArtFragment.java:63)
11-28 08:30:18.939: E/AndroidRuntime(602):  at es.app.adeptlabel.ArtFragment$CreateArrayListTaskArt.onPostExecute(ArtFragment.java:1)
11-28 08:30:18.939: E/AndroidRuntime(602):  at android.os.AsyncTask.finish(AsyncTask.java:417)
11-28 08:30:18.939: E/AndroidRuntime(602):  at android.os.AsyncTask.access$300(AsyncTask.java:127)
11-28 08:30:18.939: E/AndroidRuntime(602):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
11-28 08:30:18.939: E/AndroidRuntime(602):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-28 08:30:18.939: E/AndroidRuntime(602):  at android.os.Looper.loop(Looper.java:123)
11-28 08:30:18.939: E/AndroidRuntime(602):  at android.app.ActivityThread.main(ActivityThread.java:3683)
11-28 08:30:18.939: E/AndroidRuntime(602):  at java.lang.reflect.Method.invokeNative(Native Method)
11-28 08:30:18.939: E/AndroidRuntime(602):  at java.lang.reflect.Method.invoke(Method.java:507)
11-28 08:30:18.939: E/AndroidRuntime(602):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-28 08:30:18.939: E/AndroidRuntime(602):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-28 08:30:18.939: E/AndroidRuntime(602):  at dalvik.system.NativeStart.main(Native Method)
11-28 08:30:19.099: E/Buffer Error(602): Error converting result java.io.IOException: Attempted read on closed stream.

我的类继承自 ListFragment

public class RlsFragment extends ListFragment{


Activity mActivity;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // normally you should inflate a view here and save references
// using ListFragment default layout for this example
    return super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public void onStart() {
super.onStart();
new CreateArrayListTaskRls().execute();
}


private class CreateArrayListTaskRls extends AsyncTask<String, Void, ArrayList <ElementosList>> {


    protected ArrayList <ElementosList> doInBackground(String...strings)
    {
        ArrayList <ElementosList> itemRls = new ArrayList <ElementosList>();
        itemRls.clear();
        loadDataJsonRls();
        for(int i=0;i<ListViewConfig.getResim_list_txt().size();i++)
        {
            itemRls.add(new ElementosList(ListViewConfig.getResim_list_txt().get(i),
                    ListViewConfig.getResim_list_img().get(i)));
        }       
        return itemRls;
    }

    protected void onPostExecute(ArrayList <ElementosList> itemsRls) {
        ArrayAdapter<ElementosList>adaptadorRls = new AdaptadorList(getActivity(),itemsRls);
        setListAdapter(adaptadorRls);                  
    }

    }//fin createArraylistTask

.
.
.
.
.
.

La clase AdaptadorList

public class AdaptadorList extends ArrayAdapter<ElementosList> {

Activity contexto;
private ArrayList<ElementosList> elementos;

AdaptadorList(Activity contexto, ArrayList<ElementosList> elementos)
{       
    super(contexto,R.layout.opciones,elementos);
    this.elementos = elementos;
    this.contexto = contexto;
}

public View getView(int position, View convertView, ViewGroup parent )
{
    View item = convertView;
    final VistaTag vistaTag;
    if(item==null)
    {
        LayoutInflater inflater = contexto.getLayoutInflater();
        item = inflater.inflate(R.layout.opciones, null);
        vistaTag = new VistaTag();
        vistaTag.titulo = (TextView)item.findViewById(R.id.textView1);
        vistaTag.imgadpt = (ImageView)item.findViewById(R.id.imageView1);
        item.setTag(vistaTag);          
    }
    else
    {
        vistaTag = (VistaTag)item.getTag();
    }
    //Aplicacion fuente verdana
    Typeface verdana = Typeface.createFromAsset(contexto.getAssets(), "verdana.ttf");

    vistaTag.titulo.setText(elementos.get(position).getTitulo());
    vistaTag.titulo.setTypeface(verdana);
    vistaTag.imgadpt.setImageBitmap(getBitmapFromURL(elementos.get(position).getImagen()));

    return(item);

}//fin getView

【问题讨论】:

  • 尝试读取已关闭的流 - 因此您正在尝试读取已关闭的流(可能在您从服务器读取 JSON 时)。
  • 错误在 postexecute() 中调试它并找出其中的空值。在做任何事情之前检查 not null。

标签: android android-asynctask android-listfragment


【解决方案1】:

这是片段和 AsyncTask 的常见问题。这是由于 AsyncTask 完成它正在工作的那一刻,然后片段视图不存在。如果您将 AsyncTask 与片段一起使用,请始终检查片段的视图是否可用。更好的方法是使用加载器。

这可以修复您的代码:

private class CreateArrayListTaskRls extends AsyncTask<String, Void, ArrayList <ElementosList>> {


protected ArrayList <ElementosList> doInBackground(String...strings)
{
    ArrayList <ElementosList> itemRls = new ArrayList <ElementosList>();
    itemRls.clear();
    loadDataJsonRls();
    for(int i=0;i<ListViewConfig.getResim_list_txt().size();i++)
    {
        itemRls.add(new ElementosList(ListViewConfig.getResim_list_txt().get(i),
                ListViewConfig.getResim_list_img().get(i)));
    }       
    return itemRls;
}

protected void onPostExecute(ArrayList <ElementosList> itemsRls) {
    ArrayAdapter<ElementosList>adaptadorRls = new AdaptadorList(getActivity(),itemsRls);
    if (getListView() != null) {        
       setListAdapter(adaptadorRls);                  
    }
}

}//fin createArraylistTask

【讨论】:

  • 如何调用listview?我在布局中没有它。谢谢
  • 对不起,我看到你使用 ListFragment 所以改成 getListView()。
  • 问题是屏幕旋转两次时Context为null。感谢 Oknesif 的帮助。
  • 你使用上下文吗?尝试使用 getActivity().getApplicationContext()。
【解决方案2】:

解决方案:

protected void onPostExecute(ArrayList <ElementosList> itemsRls) {
   if (getListView() != null) {  ArrayAdapter<ElementosList>adaptadorRls = new AdaptadorList(getActivity(),itemsRls);           
   setListAdapter(adaptadorRls);                  
}
}

感谢大家。谢谢 Oknesif。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多