使用异步任务

时间:2012-05-02 23:22:33

标签: android android-asynctask

无论如何使用AsyncTask而不传入任何参数?我目前正在传递一个空字符串,但我没有做任何事情:

    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);
}

出于某种原因,当我运行如图所示的代码时,doInBackground()中没有任何事情发生,对话框消失,TabbedView活动开始。

但是,当我使用doInBackground()运行某些代码时,对话框会消失,但TabbedView活动将无法启动。所以我想知道我是否可以做任何不同的事情?

2 个答案:

答案 0 :(得分:5)

是的,您可以使用AsyncTask而不将String传递给doInBackground()方法。

只需将第一种和第三种通用类型从String更改为Void

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

}

From the doc:

  

异步任务使用的三种类型如下:

     

1)Params,执行时发送给任务的参数类型。

     

2)进度,

期间发布的进度单位的类型      

3)背景计算。结果,结果的类型   背景计算。

对于onPostExecute的签名,试试这个:

@Override
protected void onPostExecute(Void unused) {

}

修改

对于参数,它实际上非常简单。

考虑一下:

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) {
    }
}

为了确定 Type1 Type2 Type3 应该是什么,你将不得不问自己3个问题:

  • 我应该将哪个参数传递给我的任务? =&GT; 类型1

  • 处理过程中需要显示的中间结果的类型是什么? =&GT;
    2型

  • 结果操作的类型是什么? =&GT; 的Type3

在您的情况下,我不知道您正在下载数据的URL是全局定义还是要将其传递给任务。如果它是全局定义的,那么 Type1 应该 Void

如果要将其传递给任务,则可以将其传递给doInBackground()方法, Type1 String

显然,对于您的情况,您不需要担心 Type2 ,因为您没有发布任何中间结果,因为您没有对onPostExecute()中的结果做任何事情,那么Type3也是Void

总结一下,你将拥有:

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
      }
}

或者:

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
      }
}

根据您的需要而定。这够清楚了吗?

答案 1 :(得分:1)

您可以为Void generics

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

查看AsyncTask generics部分