2017-01-15 2 views
0

Wie übergebe ich ProductFragment, lv und urlAddress an die AsyncTask. Wenn ich zu AppCompatActivity erben, kein Fehler vorhanden ist, aber wenn ich zu Fragment erben gibt es einen Fehler Der Fehler in der LeitungWie Übergeben von Zeichenfolgenwert an die AsyncTask für ein Fragment

new Downloader(ProductFragment.this,urlAddress,lv).execute(); 

Das ist mein ProductFragment

import android.app.Fragment; 
    import android.app.ListFragment; 
    import android.os.Bundle; 
    import android.support.design.widget.FloatingActionButton; 
    import android.support.v4.app.FragmentActivity; 
    import android.support.v7.app.AppCompatActivity; 
    import android.support.v7.widget.Toolbar; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ListView; 

    import com.wawi.wawireg.m_MySQL.Downloader; 


    public class ProductFragment extends Fragment { 

     final static String urlAddress = "http://**.**.**.**/**/****.php"; 

     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

      View view = inflater.inflate(R.layout.calendar_main, container, false); 





      Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); 
      setSupportActionBar(toolbar); 

      FloatingActionButton fab = (FloatingActionButton)view.findViewById(R.id.fab); 

      final ListView lv = (ListView)view.findViewById(R.id.lv); 

      fab.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        new Downloader(ProductFragment.this,urlAddress,lv).execute(); 
       } 
      }); 


      return view; } 

    } 

This is my AsyncTask 

    public class Downloader extends AsyncTask<Void,Void,String> { 


    Context c; 
    String urlAddress; 
    ListView lv; 

    ProgressDialog pd; 



    public Downloader(Context c, String urlAddress, ListView lv) { 
    this.c = c; 
     this.urlAddress = urlAddress; 
     this.lv = lv; } 


    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     pd=new ProgressDialog(c); 
     pd.setTitle("Retrieve"); 
     pd.setMessage("Retrieving...Please wait"); 
     pd.show(); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     return downloadData(); 
    } 

    @Override 
    protected void onPostExecute(String jsonData) { 
     super.onPostExecute(jsonData); 

     pd.dismiss(); 

     if(jsonData==null) 
     { 
      Toast.makeText(c,"Unsuccessful, No data Retrieved",Toast.LENGTH_SHORT).show(); 
     }else { 
      //PARSE 
      DataParser parser=new DataParser(c,jsonData,lv); 
      parser.execute(); 

     } 
    } 

    private String downloadData() 
    { 
     HttpURLConnection con=Connector.connect(urlAddress); 
     if(con==null) 
     { 
      return null; 
     } 

     try 
     { 
      InputStream is=new BufferedInputStream(con.getInputStream()); 
      BufferedReader br=new BufferedReader(new InputStreamReader(is)); 

      String line; 
      StringBuffer jsonData=new StringBuffer(); 


      while ((line=br.readLine()) != null) 
      { 
       jsonData.append(line+"\n"); 
      } 

      br.close(); 
      is.close(); 

      return jsonData.toString(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     return null; 
    } 
} 
+3

Können Sie weitere Informationen bereitstellen (z. B. eine Stapelprotokollierung)? – vallismortis

+0

das Problem ist, verwenden Sie Fragment als Kontext, der falsch ist. neuen Downloader ändern (ProductFragment.this, urlAddress, lv) .execute(); zum neuen Downloader (getContext(), urlAddress, lv) .execute(); –

Antwort

1

Dies wird den Fehler beheben,

new Downloader(getActivity(), urlAddress, lv).execute(); 

Ihre Downloader braucht eine Context als erstes Argument.

public Downloader(Context c, String urlAddress, ListView lv) { 
    this.c = c; 
    this.urlAddress = urlAddress; 
    this.lv = lv; 
} 

Sie brauchen nicht zwei AsyncTasks, um die Daten herunterzuladen und zu analysieren. Sie können es mit einem einzigen AsyncTask tun.

0

Fragment ist keine Unterklasse von Context, also wenn Sie getActivity() statt ProductFragment.this übergeben, wird es funktionieren. z.B.

new Downloader(getActivity,urlAddress,lv).execute(); 
Verwandte Themen