アクティビティまたはフラグメントのライフサイクルとほぼ自動的に統合するローダーの使用方法を理解したいと思います。本当に 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;
}