0

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;
    }
lillogoal
  • 203
  • 1
  • 3
  • 11
  • We answered this yesterday, `getActivity()` is `null`. Show us the code of the class creating the adapter and see [here](http://stackoverflow.com/questions/11536166/android-get-activity-returns-null) – Sotirios Delimanolis Sep 08 '13 at 21:08
  • @SotiriosDelimanolis i have already posted class of creating the adapteer readd!!! The link you showed me doesn't solve my problem – lillogoal Sep 08 '13 at 21:14
  • We need the code of the class calling `adapter = new ParsingArrayAdapter(....` – Sotirios Delimanolis Sep 08 '13 at 21:15
  • @SotiriosDelimanolis I posted above, read well? – lillogoal Sep 08 '13 at 21:16
  • You're really not making it easy for us to help you. Post the code that inherits the method `getActivity()` which is returning `null`. We don't care about the `ParsingArrayAdapter` class. – Sotirios Delimanolis Sep 08 '13 at 21:18
  • Honestly, [this](http://stackoverflow.com/questions/11536166/android-get-activity-returns-null) should answer your question. `getActivity()` can return `null` only under those circumstances. – Sotirios Delimanolis Sep 08 '13 at 22:05
  • @SotiriosDelimanolis i didn't capish what i will change in my source, can you explain me? – lillogoal Sep 10 '13 at 16:03

0 Answers0