0

アクティビティまたはフラグメントのライフサイクルとほぼ自動的に統合するローダーの使用方法を理解したいと思います。本当に AsyncTask が必要な場合は、適切な方法でフラグメントのライフ サイクルを管理する必要があります。一方、setReainInstance を使用して、すべての参照とともにフラグメントをメモリに保持する必要があります。それ以外の場合は再作成されます。次に、UI-null を更新しない場合は OnPostExecute getActivity、それ以外の場合は更新しません。いずれにせよ、結果をどこかに保存します。フラグメントが「切断」されてから (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;
    }
4

0 に答える 0