如何将片段转换为异步构造函数?

时间:2017-10-04 13:00:07

标签: java android casting fragment

我想将SlideshowDialogFragment转换为DdownloadTask.java中的asynctask中的上下文,但是当我写

        final DownloadTask downloadTask = new 
        DownloadTask(myActivity.this);

SlideshowDialogFragment代替myActivity,android显示警告并说出来 warning android

我不知道我在做什么?请帮助我

public class SlideshowDialogFragment extends DialogFragment{


ArrayList<Image> images;
ViewPager viewPager;
MyViewPagerAdapter myViewPagerAdapter;
TextView lblCount,lblTitle,lblDate;
Button btn_set;
Button btn_download;
int selectedPostition;
DownloadManager downloadManager;
public static ProgressDialog mProgressDialog;






static SlideshowDialogFragment newInstance(){
    SlideshowDialogFragment f=new SlideshowDialogFragment();
    return f;
}

@Override
public View onCreateView (LayoutInflater inflater,ViewGroup container,Bundle saveInstanceState)
{


    View v=inflater.inflate(R.layout.fragment_image_slider,container,false);
    viewPager=(ViewPager)v.findViewById(R.id.view_pager);

    lblTitle=(TextView)v.findViewById(R.id.title);
    lblDate=(TextView)v.findViewById(R.id.date);
    btn_set=(Button)v.findViewById(R.id.btn_set);
    btn_download=(Button)v.findViewById(R.id.btn_download);






    images=(ArrayList<Image>) getArguments().getSerializable("images");
    selectedPostition=getArguments().getInt("position");


    myViewPagerAdapter=new MyViewPagerAdapter();
    viewPager.setAdapter(myViewPagerAdapter);



    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int 
        positionOffsetPixels) {
            displayInfo(position);
            //setWallpaper(position);
        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });






    setCurrentItem(selectedPostition);

    btn_download.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            download(selectedPostition);



        }
    });






    return v;



}

   void download (int position){

    Image image=images.get(position);
    String large = image.getlarge();

    final DownloadTask downloadTask = new 
    DownloadTask(**SlideshowDialogFragment**.this);
    downloadTask.execute(large);
}

这是带有构造函数的DownloadTask Activity我在这个类中写了AsyncTask:

public class DownloadTask extends AsyncTask<String, Integer, String> {

private Context context;
private PowerManager.WakeLock mWakeLock;

public DownloadTask(Context context) {
this.context = context;
}





 @Override
 protected void onPreExecute() {
  super.onPreExecute();
  // take CPU lock to prevent CPU from going off if the user
   // presses the power button during download
  PowerManager pm = (PowerManager) 
  context.getSystemService(Context.POWER_SERVICE);
  mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
  getClass().getName());
  mWakeLock.acquire();
  mProgressDialog.show();
  }

  @Override
  protected void onProgressUpdate(Integer... progress) {
  super.onProgressUpdate(progress);
  // if we get here, length is known, now set indeterminate to false
  mProgressDialog.setIndeterminate(false);
  mProgressDialog.setMax(100);
  mProgressDialog.setProgress(progress[0]);
  }

  @Override
  protected void onPostExecute(String result) {
  mWakeLock.release();
  mProgressDialog.dismiss();
  if (result != null)
  Toast.makeText(context,"خطای دانلود "+result, Toast.LENGTH_LONG).show();
  else
  Toast.makeText(context,"دانلود با موفقیت انجام شد", 
  Toast.LENGTH_SHORT).show();
  }

  @Override
  protected String doInBackground(String... sUrl) {
  InputStream input = null;
  OutputStream output = null;
  HttpURLConnection connection = null;
  try {
  URL url = new URL(sUrl[0]);
  connection = (HttpURLConnection) url.openConnection();
  connection.connect();

  // expect HTTP 200 OK, so we don't mistakenly save error report
  // instead of the file
  if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
    return "Server returned HTTP " + connection.getResponseCode()
      + " " + connection.getResponseMessage();
  }

  // this will be useful to display download percentage
  // might be -1: server did not report the length
  int fileLength = connection.getContentLength();

  // download the file
  input = connection.getInputStream();
  output = new FileOutputStream("/sdcard/tabriz.jpg");

  byte data[] = new byte[4096];
  long total = 0;
  int count;
  while ((count = input.read(data)) != -1) {
    // allow canceling with back button
    if (isCancelled()) {
      input.close();
      return null;
    }
    total += count;
    // publishing the progress....
    if (fileLength > 0) // only if total length is known
      publishProgress((int) (total * 100 / fileLength));
    output.write(data, 0, count);
  }
} catch (Exception e) {
  return e.toString();
} finally {
  try {
    if (output != null)
      output.close();
    if (input != null)
      input.close();
  } catch (IOException ignored) {
  }

  if (connection != null)
    connection.disconnect();
}
return null;

} }

我如何将SlideshowDialogFragment投射到Async?

1 个答案:

答案 0 :(得分:0)

您需要传递一个Context,就像您定义构造函数一样。 Fragment没有Context,但Activity拥有SlideshowDialogFragment.this.getActivity(); 。由于Fragment是Activity的一部分,您可以使用

访问它
DownloadTask(getActivity())

您也可以直接使用<html> <table class="tg" border="1"> <tr> <th class="tg-yw4l">Type</th> <th class="tg-yw4l">Power</th> <th class="tg-yw4l">Torque</th> </tr> <tr> <td class="tg-yw4l" rowspan="2">Car</td> <td class="tg-yw4l">120hp</td> <td class="tg-yw4l">100nm</td> </tr> <tr> <td class="tg-yw4l" colspan="2">Has 4 wheels<br></td> </tr> </table> </html>

相关问题