使用异步任务

Joh*_*ket 0 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Amo*_*tir 5

是的,您可以使用AsyncTask而不传递StringdoInBackground()方法.

只需将第一个和第三个泛型类型更改StringVoid:

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

}
Run Code Online (Sandbox Code Playgroud)

来自doc:

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

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

2)进度,期间发布的进度单位的类型

3)背景计算.结果,后台计算结果的类型.

为了签名onPostExecute尝试这个:

@Override
protected void onPostExecute(Void unused) {

}
Run Code Online (Sandbox Code Playgroud)

编辑:

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

考虑一下:

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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我应该将什么参数传递给我的任务?=> Type1

  • 在处理过程中需要显示的中间结果的类型是什么?=>
    Type2

  • 结果操作的类型是什么?=> 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
      }
}
Run Code Online (Sandbox Code Playgroud)

要么:

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
      }
}
Run Code Online (Sandbox Code Playgroud)

根据您的需要.那清楚了吗?