2017-01-15 14 views
0

ProductFragment、lvおよびurlAddressをAsyncTaskに渡すにはどうすればよいですか。私はAppCompatActivityに継承する場合は、エラーがないが、私はFragmentに継承する場合はラインフラグメントのAsyncTaskに文字列値を渡す方法

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

にエラー エラーがあるこれは私の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

さらに多くの情報(スタックトレースなど)を提供できますか? – vallismortis

+0

問題はあなたが間違っている文脈として断片を使用しているということです。新しいダウンローダを変更する(ProductFragment.this、urlAddress、lv).execute();新しいダウンローダ(getContext()、urlAddress、lv).execute(); –

答えて

1

これは、エラーを解決しますです、

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

あなたDownloaderは、最初の引数としてContextを必要とします。

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

AsyncTasksをダウンロードして解析する必要はありません。あなたは単一のAsyncTaskを使ってそれを行うことができます。

0

フラグメントはContextのサブクラスではないため、ProductFragment.thisの代わりにgetActivity()を渡すと機能します。例えば

new Downloader(getActivity,urlAddress,lv).execute(); 
関連する問題