我想了解如何使用几乎自动与活动或片段的生命周期集成的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;
}