0

Is there anyway to use AsyncTask without passing in any parameters? I am currently passing in an empty string, but I'm not doing anything with it:

    DownloadWebPageTask task = new DownloadWebPageTask();
    task.execute(new String[] { "" });

    class DownloadWebPageTask extends AsyncTask<String, Void, String> {
    private final ProgressDialog dialog = new ProgressDialog(MainScreen.this);
     @Override
        protected void onPreExecute() {
            dialog.setMessage("Gathering data for\n"+selectedSportName+".\nPlease wait...");
            dialog.show();
        }


    @Override
    protected String doInBackground(String... urls) {
        //go do something
        return "";
    }



    @Override
    protected void onPostExecute(String result) {
      dialog.dismiss();
      startTabbedViewActivity();
    }
}

private void startTabbedViewActivity(){
    Intent intent = new Intent(MainScreen.this, TabbedView.class);
    intent.putExtra(SPORT_NAME_EXTRA, selectedSportName);
    intent.putExtra(HEADLINES_FOR_SPORT_EXTRA, existingSportHeadlines.get(selectedSportName));
    intent.putExtra(SCORES_FOR_SPORT_EXTRA, existingSportScores.get(selectedSportName));
    intent.putExtra(SCHEDULE_FOR_SPORT_EXTRA, existingSportSchedule.get(selectedSportName));
    startActivity(intent);
}

For some reason, when I run the code as shown, with nothing happening in doInBackground(), the dialog dissapears, and the TabbedView activity starts.

But, when I use doInBackground() to run some code, the dialog dissapears, but, the TabbedView activity won't start. So I'm wondering if I could be doing anything differently?

4

2 回答 2

5

Yes you can use AsyncTask without passing a String to the doInBackground() method.

Just change the first and third generic types from String to Void:

class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {

}

From the doc:

The three types used by an asynchronous task are the following:

1)Params, the type of the parameters sent to the task upon execution.

2)Progress, the type of the progress units published during the

3) background computation. Result, the type of the result of the background computation.

For the signature of onPostExecutetry this:

@Override
protected void onPostExecute(Void unused) {

}

EDIT:

For the parameters it's actually very simple.

Consider this:

class MyTask extends AsyncTask<Type1, Type2, Type3> {
    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Type3 doInBackground(Type1... param) {
    }

    @Override
    protected void onProgressUpdate(Type2... progress) {
    }

    @Override
    protected void onPostExecute(Type3 result) {
    }
}

In order to determine what Type1, Type2 and Type3 should be, you'll have to ask yourself 3 questions:

  • What parameter should I pass to my task? => Type1

  • What is the type of the intermediate results that need to be shown during processing? =>
    Type2

  • What is the type of the resulting operation? => Type3

In your case, I don't know whether the URL that you are downloading data from is defined in a globally or you want to pass it to the task. If it's defined globally, then you don't Type1 should be Void.

If you want to pass it to the task, then you can pass it to the doInBackground() method and Type1 would be String.

Obviously for your case you don't need to worry about Type2 since you aren't publishing any intermediate results and since you aren't doing anything with the result in onPostExecute() then Type3 is Void too.

To summarize you'll have:

class DownloadWebPageTask extends AsyncTask<String, Void, Void> {
      @Override
      protected Void doInBackground(String... urls) {
         // do something with urls[0]
      }

      @Override
      protected void onPostExecute(Void unused) {
         // dismiss pd and start new intent
      }
}

Or:

class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {
      @Override
      protected Void doInBackground(Void... unused) {

      }

      @Override
      protected void onPostExecute(Void unused) {
         // dismiss pd and start new intent
      }
}

Depending on your needs. Is that clear enough?

于 2012-05-02T23:24:43.460 回答
1

You simple specify Void for AsyncTask generics

 class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {

Look at the AsyncTask generics section

于 2012-05-02T23:25:52.413 回答