gpt4 book ai didi

java - Android Xml Pull 解析器错误 - SitesDownloadTask.onPostExecute

转载 作者:行者123 更新时间:2023-12-02 05:35:15 24 4
gpt4 key购买 nike

我的应用程序中有三个不同的适配器和三个 XML 解析器,用于在 ViewPager 上滑动的三个 fragment 。

我的应用程序工作正常,直到我开始在第一个和第二个或第二个和第三个 fragment 之间滑动得更快一些。

记录 Cat 消息:

在第一和第二之间滑动时:

FATAL EXCEPTION: main
Process: com.intera.eronetmarket, PID: 3326
java.lang.NullPointerException
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
at adapters.KatAdapter.<init>(KatAdapter.java:32)
at com.intera.eronetmarket.Kategorije$SitesDownloadTask.onPostExecute(Kategorije.java:98)
at com.intera.eronetmarket.Kategorije$SitesDownloadTask.onPostExecute(Kategorije.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)

在第二个和第三个之间滑动时:

FATAL EXCEPTION: main
Process: com.intera.eronetmarket, PID: 3359
java.lang.NullPointerException
at com.intera.eronetmarket.Preporuceno$AppDownloadTask.onPostExecute(Preporuceno.java:85)
at com.intera.eronetmarket.Preporuceno$AppDownloadTask.onPostExecute(Preporuceno.java:1)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)

我的第一个 fragment 是 AppDownlodTask 类所在的位置。所有 3 个 fragment 都是相同的(每个 fragment 仅适配器不同):

public class Preporuceno extends Fragment  {

private AppAdapter mAdapter;
private ListView siteList;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.i("mobAppModel", "OnCreate()");
View rootView = inflater.inflate(R.layout.activity_preporuceno, container, false);


siteList = (ListView) rootView.findViewById(R.id.listView1);

siteList.setOnItemClickListener(new OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View v, int pos,long id) {
String url = mAdapter.getItem(pos).getstoreURL();
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

}
});

if(isNetworkAvailable()){
Log.i("mobAppModel", "starting download Task");
AppDownloadTask download = new AppDownloadTask();
download.execute();
}else{
mAdapter = new AppAdapter(getActivity().getApplicationContext(), -1, XMLsourcePullParser.getmobAppModel(getActivity()));
siteList.setAdapter(mAdapter);
}

return rootView;
}

private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
private class AppDownloadTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... arg0) {
//Download the file
try {
Downloader.DownloadFromUrl("https://dl.dropboxusercontent.com/s/te0c0s7y7zr79tm/kategorijeXML.xml", getActivity().openFileOutput("XMLsource.xml", Context.MODE_PRIVATE));
} catch (FileNotFoundException e) {
e.printStackTrace();
}

return null;
}
@Override
protected void onPostExecute(Void result){
//setup our Adapter and set it to the ListView.

mAdapter = new AppAdapter(getActivity().getApplicationContext(), -1, XMLsourcePullParser.getmobAppModel(getActivity()));

siteList.setAdapter(mAdapter);

Log.i("mobAppModel", "adapter size = "+ mAdapter.getCount());
}

}

}

我的适配器:

package adapters;

import java.util.List;
import models.KatModel;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.intera.eronetmarket.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;


/*
* Custom Adapter class that is responsible for holding the list of sites after they
* get parsed out of XML and building row views to display them on the screen.
*/
public class KatAdapter extends ArrayAdapter<KatModel> {

ImageLoader imageLoader;
DisplayImageOptions options;


public KatAdapter(Context ctx, int textViewResourceId, List<KatModel> sites) {

super(ctx, textViewResourceId, sites);

//Setup the ImageLoader, we'll use this to display our images
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(ctx).build();
imageLoader = ImageLoader.getInstance();
if (!imageLoader.isInited()) {
imageLoader.init(config);
}

//Setup options for ImageLoader so it will handle caching for us.
options = new DisplayImageOptions.Builder()
.cacheInMemory()
.cacheOnDisc()
.build();}





/*
* (non-Javadoc)
* @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup)
*
* This method is responsible for creating row views out of a StackSite object that can be put
* into our ListView
*/
@SuppressLint("InflateParams")
@Override
public View getView(int pos, View convertView, ViewGroup parent){
RelativeLayout row = (RelativeLayout)convertView;
Log.i("StackSites", "getView pos = " + pos);
if(null == row){
//No recycled View, we have to inflate one.
LayoutInflater inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = (RelativeLayout)inflater.inflate(R.layout.row_site, null);
}

//Get our View References

TextView nameTxt = (TextView)row.findViewById(R.id.nameTxt);



//Initially we want the progress indicator visible, and the image invisible




//Load the image and use our options so caching is handled.


//Set the relavent text in our TextViews
nameTxt.setText(getItem(pos).getcategoryName());




return row;


}

}

--

package adapters;

import java.util.List;

import models.mobAppModel;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;

import com.intera.eronetmarket.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;

@SuppressLint("InflateParams") public class AppAdapter extends ArrayAdapter<mobAppModel>{
ImageLoader imageLoader;
DisplayImageOptions options;
public AppAdapter(Context ctx,int textViewResourceId, List<mobAppModel> appModel){
super(ctx,textViewResourceId,appModel);

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(ctx).build();
imageLoader = ImageLoader.getInstance();
if (!imageLoader.isInited()) {
imageLoader.init(config);
}



options= new DisplayImageOptions.Builder()
.cacheInMemory()
.cacheOnDisc()
.build();
}

public View getView(int pos, View convertView, ViewGroup parent){
RelativeLayout row = (RelativeLayout)convertView;
Log.i("mobAppModels", "getView pos = " + pos);
if(null == row){
//No recycled View, we have to inflate one.
LayoutInflater inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = (RelativeLayout)inflater.inflate(R.layout.row_app, null);
}

//Get our View References
final ImageView iconImg = (ImageView)row.findViewById(R.id.iconUrl);
final ProgressBar indicator = (ProgressBar)row.findViewById(R.id.progress);

//Initially we want the progress indicator visible, and the image invisible
indicator.setVisibility(View.VISIBLE);
iconImg.setVisibility(View.INVISIBLE);

//Setup a listener we can use to swtich from the loading indicator to the Image once it's ready
ImageLoadingListener listener = new ImageLoadingListener(){



@Override
public void onLoadingStarted(String arg0, View arg1) {
// TODO Auto-generated method stub

}

@Override
public void onLoadingCancelled(String arg0, View arg1) {
// TODO Auto-generated method stub

}

@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {
indicator.setVisibility(View.INVISIBLE);
iconImg.setVisibility(View.VISIBLE);
}

@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
// TODO Auto-generated method stub

}

};

//Load the image and use our options so caching is handled.
imageLoader.displayImage(getItem(pos).getimageUrl(),iconImg,options,listener);

//Set the relavent text in our TextViews




return row;


}

}

--

package adapters;

import java.util.List;
import models.mobAppModel;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.RatingBar;
import com.intera.eronetmarket.R;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageLoadingListener;

public class AppAdapterNajpop extends ArrayAdapter<mobAppModel>{
ImageLoader imageLoader;
DisplayImageOptions options;
public AppAdapterNajpop(Context ctx,int textViewResourceId, List<mobAppModel> appModel){
super(ctx,textViewResourceId,appModel);

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(ctx).build();
imageLoader = ImageLoader.getInstance();
if (!imageLoader.isInited()) {
imageLoader.init(config);
}


options= new DisplayImageOptions.Builder()
.cacheInMemory()
.cacheOnDisc()
.build();
}

@SuppressLint("InflateParams")
public View getView(int pos, View convertView, ViewGroup parent){
RelativeLayout row = (RelativeLayout)convertView;
Log.i("mobAppModels", "getView pos = " + pos);
if(null == row){
//No recycled View, we have to inflate one.
LayoutInflater inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = (RelativeLayout)inflater.inflate(R.layout.row_app_najpopularnije, null);
}

//Get our View References
final ImageView iconImg = (ImageView)row.findViewById(R.id.iconUrl);
TextView appHeadline = (TextView)row.findViewById(R.id.textView1);
TextView developer = (TextView)row.findViewById(R.id.textView2);
RatingBar ratingpoints =(RatingBar)row.findViewById(R.id.ratingBar);
final ProgressBar indicator = (ProgressBar)row.findViewById(R.id.progress);

//Initially we want the progress indicator visible, and the image invisible
indicator.setVisibility(View.VISIBLE);
iconImg.setVisibility(View.INVISIBLE);

//Setup a listener we can use to swtich from the loading indicator to the Image once it's ready
ImageLoadingListener listener = new ImageLoadingListener(){



@Override
public void onLoadingStarted(String arg0, View arg1) {
// TODO Auto-generated method stub

}

@Override
public void onLoadingCancelled(String arg0, View arg1) {
// TODO Auto-generated method stub

}

@Override
public void onLoadingComplete(String arg0, View arg1, Bitmap arg2) {
indicator.setVisibility(View.INVISIBLE);
iconImg.setVisibility(View.VISIBLE);
}

@Override
public void onLoadingFailed(String arg0, View arg1, FailReason arg2) {
// TODO Auto-generated method stub

}

};

//Load the image and use our options so caching is handled.
imageLoader.displayImage(getItem(pos).geticonUrl(),iconImg,options,listener);

//Set the relavent text in our TextViews
appHeadline.setText(getItem(pos).getappHeadline());
developer.setText(getItem(pos).getdeveloper());
ratingpoints.setRating(Float.parseFloat(getItem(pos).getratingPoints()));


return row;


}

}

当我滑动得较慢时,一切都正常。怎么了? :\

最佳答案

当你从 fragment A快速翻转到B时,A随时可能被摧毁,而你对此无法控制。在fragment销毁过程完成之前,它也会从activity中分离出来。从这一刻开始,任何调用 getActivity() 都可能返回 null

所以你的问题是你的 fragment 没有对 Activity 的引用,但异步任务仍然在后台线程中运行,导致空指针异常。

我建议你这样做:

Activity attached = getActivity();
if (attached != null) {
mAdapter = new AppAdapter(attached.getApplicationContext(), -1, XMLsourcePullParser.getmobAppModel(getActivity()));
siteList.setAdapter(mAdapter);
}

有关此问题的更多信息,请参见:http://developer.android.com/guide/components/fragments.html#Lifecycle 。我想强调一下注意 session :如果您的 Fragment 中需要一个 Context 对象,您可以调用 getActivity()。但是,请注意仅当 fragment 附加到 Activity 时才调用 getActivity()。当 fragment 尚未附加或在其生命周期结束时分离时,getActivity() 将返回 null。

关于java - Android Xml Pull 解析器错误 - SitesDownloadTask.onPostExecute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25041444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com