I would like to understand how to use a Loader that integrates almost automatically with the life cycle of activity or fragment. If you really need a AsyncTask then you have to manage the life cycle of the fragment in an appropriate manner. Meanwhile, you have to use setReainInstance to keep the fragment in memory with all the references, otherwise it is recreated, then OnPostExecute getActivity if you do not update the UI-null, otherwise not, and in any case, save the results somewhere, if the fragment is "disconnected" and then back on (onActivityCreated) you can update the UI with the data that you've saved. Why am by obtaining a bit 'of time always the same error:
java.lang.NullPointerException
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:104)
at com.megadown.megacodownloader.ParsingArrayAdapter.<init>(ParsingArrayAdapter.java:30)
at com.megadown.megacodownloader.Tab_Search$ParsingPaginaWeb.onPostExecute(Tab_Search.java:256)
at com.megadown.megacodownloader.Tab_Search$ParsingPaginaWeb.onPostExecute(Tab_Search.java:118)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4898)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
at dalvik.system.NativeStart.main(Native Method)
09-08 02:46:26.289 3004-3004/? E/Launcher: Error finding setting, default accessibility to not found: accessibility_enabled
Refers to this:
public class Tab_Search extends Fragment implements SearchView.OnQueryTextListener{
View view;
ListView lista;
int cont = 0;
String search = "";
public SearchView mSearchView;
ParsingPaginaWeb parsing = new ParsingPaginaWeb();
String [] indirizzo;
WebView webview;
ParsingArrayAdapter adapter;
int sdk = android.os.Build.VERSION.SDK_INT;
final String[] theUrl = new String[1];
int volte = 0;
Activity mActivity;
Context c;
ArrayList<String> titoli; //lista dei titoli
ArrayList<String> descrizioni; //lista delle descrizioni
// ArrayList<Integer> immagini;
int [] immagini;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
view = inflater.inflate(R.layout.tab_search, container, false);
c = view.getContext();
setRetainInstance(true);
if (savedInstanceState != null) {
return view;
}
webview = (WebView) view.findViewById(R.id.web);
webview.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
theUrl[0] = url;
System.out.println(theUrl[0]);
Toast.makeText(getActivity(),"Link:"+url,Toast.LENGTH_SHORT).show();
copy();
paste();
}
});
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webview.getSettings().setLoadWithOverviewMode(true);
webview.getSettings().setUseWideViewPort(true);
webview.getSettings().setPluginsEnabled(true);
//web_view.getSettings().setBuiltInZoomControls(true);
webview.getSettings().setSupportMultipleWindows(true);
webview.getSettings().setLoadsImagesAutomatically(true);
webview.getSettings().setLightTouchEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.getSettings().setLoadWithOverviewMode(true);
lista = (ListView)view.findViewById(R.id.main_lista);//recupero lista da id
lista.setClickable(true);
lista.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
{
int posizione = position+1;
webview.loadUrl(indirizzo[position]);
}
});
//creo ed eseguo l'asynctask
parsing.execute("");
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
mActivity = this.getActivity();
}
private class ParsingPaginaWeb extends AsyncTask<String,Integer,String> {
String title;
String sizes;
int cont = 0;
int contatore2 = 0;
@Override
protected void onPreExecute()
{
//prima di eseguire il parsing inizializzo gli arraylist
titoli = new ArrayList<String>();
descrizioni = new ArrayList<String>();
//immagini = new ArrayList<Integer>();
immagini = new int[500];
indirizzo = new String[500];
}
@Override
protected String doInBackground(String... params) {
try {
// NB: controllate di importare le classi giuste
// all'inizio ci deve essere org.jsoup
// ricavo l'html della pagina con user agent desktop (Chrome)
// e timeout 30000
Document doc = Jsoup.connect("link"+search)
.userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")
.get();
// prendo la tabella
// (con .first() ottengo il primo elemento, in questo caso l'unico )
Elements links = doc.select(".link");
for( Element link: links )
{
String href = link.attr("href");
Elements titles = link.select( ".title" );
Elements size = link.select(".size");
title = ( titles.size() > 0 ) ? titles.get( 0 ).text() : "";
sizes = (size.size() > 0) ? size.get(0).text() : "";
if(contatore2 > 1)
{
if(title.toString().endsWith(".zip"))
{
immagini[cont] = (R.drawable.appx7zipicon);
}else if(title.toString().endsWith(".mp3"))
{
immagini[cont] = (R.drawable.mp3icon);
}else if(title.toString().endsWith(".avi"))
{
immagini[cont] = (R.drawable.movieicon);
}else if(title.toString().endsWith(".rar"))
{
immagini[cont] = (R.drawable.appx7zipicon);
}
else if(title.toString().endsWith(".mp4"))
{
immagini[cont] = (R.drawable.movieicon);
}else if(title.toString().endsWith(".mkv"))
{
immagini[cont] = (R.drawable.movieicon);
}else if(title.toString().endsWith(".png"))
{
immagini[cont] = (R.drawable.pngicon);
}else if(title.toString().endsWith(".jpg"))
{
immagini[cont] = (R.drawable.jpegicon);
}else if(title.toString().endsWith(".jpeg"))
{
immagini[cont] = (R.drawable.jpegicon);
}else if(title.toString().endsWith(".pdf"))
{
immagini[cont] = (R.drawable.pdfdocumenticon);
}else if(title.toString().endsWith(".txt"))
{
immagini[cont] = (R.drawable.txt);
}else if(title.toString().endsWith(".apk"))
{
immagini[cont] = (R.drawable.apk_icon);
}else if(title.toString().endsWith(".epub"))
{
immagini[cont] = (R.drawable.ebook_icon);
}else if(title.toString().endsWith(".ebook"))
{
immagini[cont] = (R.drawable.ebook_icon);
}else if(title.toString().endsWith(".7z"))
{
immagini[cont] = (R.drawable.appx7zipicon);
}else if(title.toString().endsWith(".m4a"))
{
immagini[cont] = (R.drawable.mp3icon);
}else if(title.toString().endsWith(".exe"))
{
immagini[cont] = (R.drawable.exe_icon);
}else if(title.toString().endsWith(".torrent"))
{
immagini[cont] = (R.drawable.torrent_icon);
}else if(title.toString().endsWith(".iso"))
{
immagini[cont] = (R.drawable.iso_icon);
}else if(title.toString().endsWith(".rmvb"))
{
immagini[cont] = (R.drawable.movieicon);
}else if(title.toString().endsWith(".mpg"))
{
immagini[cont] = (R.drawable.movieicon);
}
cont++;
}
contatore2++;
titoli.add( title );
descrizioni.add("Dimensione: "+sizes );
indirizzo[cont] = href;
}
// inserisco nei rispettivi arraylist
} catch (Exception e) {
// gestione dell'eccezione
// ad esempio mostrare messaggio di errore o altro (qui nel logcat)
Log.e("ESEMPIO", "ERRORE NEL PARSING");
}
return null;
}
protected void onPostExecute(String result)
{
// dopo che ho eseguito il parsing mostro i dati nella listview
if(titoli.size() > 0 || descrizioni.size() >0)
{
titoli.remove(0); titoli.remove(0);
descrizioni.remove(0); descrizioni.remove(0);
}
if(adapter == null)
{
adapter = new ParsingArrayAdapter(c, titoli, descrizioni,immagini);
lista.setAdapter(adapter);
}else
{
lista.setAdapter(adapter);
}
}
}
public void setupSearchView(MenuItem searchItem) {
if (isAlwaysExpanded()) {
mSearchView.setIconifiedByDefault(false);
} else {
searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM
| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
}
mSearchView.setOnQueryTextListener(this);
}
public boolean onQueryTextChange(String newText) {
return false;
}
public boolean onQueryTextSubmit(String query) {
search = query;
ParsingPaginaWeb parsing2 = new ParsingPaginaWeb();
parsing2.execute("");
return false;
}
public boolean onClose() {
return false;
}
protected static boolean isAlwaysExpanded() {
return false;
}
public boolean isOnline(){
ConnectivityManager cm =
(ConnectivityManager) getActivity().getSystemService(getActivity().CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
public void paste(){
android.text.ClipboardManager clipBoard = (android.text.ClipboardManager) getActivity().getSystemService(getActivity().CLIPBOARD_SERVICE);
final String temp;
temp = clipBoard.getText().toString();
//Tab_Download.txt_url.setText("ciao"+temp);
Toast.makeText(getActivity(),"Link Copiato con Successo",Toast.LENGTH_SHORT).show();
if(temp.toString().startsWith("https://mega.co.nz"))
{
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Scegli:")
.setMessage("Vuoi scaricare il files o vederlo in streaming?")
.setCancelable(false)
.setPositiveButton("Stream", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (temp.toString() != null) {
MainActivity.actionBar.setSelectedNavigationItem(2);
Tab_Streaming.txt_link_stream.setText(temp);
if (Tab_Streaming.txt_link_stream.getText() != null)
Toast.makeText(getActivity(), "Link Incollato con Successo", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), "Prima devi copiare qualcosa!!", Toast.LENGTH_SHORT).show();
}
}
})
.setNegativeButton("Download", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (temp.toString() != null) {
MainActivity.actionBar.setSelectedNavigationItem(0);
Tab_Download.txt_url.setText(temp.toString());
if (Tab_Download.txt_url.getText() != null)
Toast.makeText(getActivity(), "Link Incollato con Successo", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getActivity(), "Prima devi copiare qualcosa!!", Toast.LENGTH_SHORT).show();
}
}
});
AlertDialog alert = builder.create();
alert.show();
//Toast.makeText(getActivity(),"Link Incollato con Successo",Toast.LENGTH_SHORT).show();
//MainActivity.actionBar.setSelectedNavigationItem(0);
}
}
public void copy(){
if(sdk < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getActivity().getSystemService(getActivity().CLIPBOARD_SERVICE);
clipboard.setText(theUrl[0]);
//txt_link.setText("");
if(clipboard.getText().toString().compareTo("") != 0){
Toast.makeText(getActivity(),"Link Copiato con Successo",Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(getActivity(),"Non sono Riuscito a copiare nessun Link",Toast.LENGTH_SHORT).show();
}
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getActivity().getSystemService(getActivity().CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("text label",theUrl[0]);
clipboard.setPrimaryClip(clip);
//txt_link.setText("");
}
}
public static Tab_Search newInstance(String text) {
Tab_Search f = new Tab_Search();
Bundle b = new Bundle();
b.putString("msg", text);
f.setArguments(b);
return f;
}
public void toast(String string) {
Toast.makeText(getActivity(), string, Toast.LENGTH_SHORT).show();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = activity;
}
@Override
public void onStop() {
super.onStop();
mActivity = this.getActivity();
adapter = new ParsingArrayAdapter(mActivity, titoli, descrizioni,immagini);
lista.setAdapter(adapter);
}
}
This is ParsingArrayAdapter:
public class ParsingArrayAdapter extends ArrayAdapter<String>{
//riferimenti statici alle risorse e agli id
private final static int LAYOUT = R.layout.riga_listview;
private final static int TITOLO = R.id.riga_listview_titolo;
private final static int DESCRIZIONE = R.id.riga_listview_descrizione;
private final static int IMMAGINE = R.id.imageView;
ArrayList<String> titoli; //lista dei titoli
ArrayList<String> descrizioni;
//ArrayList<Integer> immagini;//lista delle descrizioni
int [] immagini;
Context c; //context
LayoutInflater inflater; //layout inflater
public ParsingArrayAdapter(Context context, ArrayList<String> titoli, ArrayList<String> descrizioni, int[] immagini)
{
super(context,TITOLO);
this.c = context;
this.titoli = titoli;
this.descrizioni = descrizioni;
this.immagini = immagini;
this.inflater = LayoutInflater.from(c);
}
@Override
public int getCount()
{
return titoli.size(); //ritorno lunghezza lista ( = numero dei titoli)
}
//quando la lista richiede una view
@Override
public View getView(int pos,View view,ViewGroup parent)
{
CacheRiga cache; //cache
if(view==null)//se � la prima volta che viene richiesta la view
{
// creo la view ma non l'attacco alla lista in quanto devo ancora modificare
// i testi delle textview
view = inflater.inflate(LAYOUT, parent,false);
cache = new CacheRiga(); //inizializzo la cache
cache.titolo = (TextView) view.findViewById(TITOLO); //collego titolo
cache.descrizione = (TextView) view.findViewById(DESCRIZIONE);//collego descrizione
cache.img = (ImageView) view.findViewById(IMMAGINE);
view.setTag(cache);//collego view con cache
}
else
{
cache = (CacheRiga) view.getTag(); //altrimenti prendo la cache dalla view
}
cache.titolo.setText(titoli.get(pos)); //imposto il titolo
cache.descrizione.setText(descrizioni.get(pos));
// if(pos>0)
//{
cache.img.setImageResource(immagini[pos]);
//}
// e la descrizione
return view;
}
private class CacheRiga { // classe per la cache delle righe
public TextView titolo; // cache titolo
public TextView descrizione; // cache descrizione
public ImageView img;
}