Activity或Fragment返回null

时间:2013-09-08 21:05:25

标签: java android android-fragments android-asynctask android-activity

我想了解如何使用几乎自动与活动或片段的生命周期集成的Loader。 如果您确实需要AsyncTask,那么您必须以适当的方式管理片段的生命周期。 同时,您必须使用setReainInstance将片段保留在内存中,并使用所有引用,否则重新创建,然后OnPostExecute getActivity如果您不更新UI-null,否则不会,并且在任何情况下,将结果保存在某处,如果片段“断开连接”,然后重新打开(onActivityCreated),您可以使用已保存的数据更新UI。 为什么通过获得一点时间总是相同的错误:

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

指的是:

    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);
    }
}

这是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;
    }

0 个答案:

没有答案