[英]AsyncTask NullPointerException after two rotates with listfragment
我有一個與LisFragment和ViewPagerIndicator一起使用的應用程序。 當屏幕旋轉兩次時,應用程序會給出logcat附加的錯誤。 我的問題似乎與上下文為空有關。 我在StackOverflow上看到了幾個問題,但沒有設法解決。 似乎我必須實現onAttach和onDetach方法,但並不是像我嘗試的那樣失敗。
請你幫我一下。 坦率地說,我對這個問題感到絕望。
謝謝。
我的LogCat
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
這是片段和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
解:
protected void onPostExecute(ArrayList <ElementosList> itemsRls) {
if (getListView() != null) { ArrayAdapter<ElementosList>adaptadorRls = new AdaptadorList(getActivity(),itemsRls);
setListAdapter(adaptadorRls);
}
}
謝謝大家。 感謝Oknesif。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.