如何让Async在后台运行线程?

时间:2011-07-12 20:38:36

标签: java android android-asynctask

我正在提取大约1500个数据图并将它们添加到地图视图的叠加层中。我想在另一个线程中运行它,而我的程序的其余部分完成启动。我希望一个进度微调器只在地图部分旋转,同时加载数据绘图点。

我已经搜索并找到了我需要的东西,但我不知道如何实现它以及我的代码中的位置。

  1. 我会在params中加入什么
  2. 这是进入另一个类还是我的主要oncreate方法。
  3. 我何时会调用这些方法?

    private class UpdateFeedTask extends AsyncTask<MyActivity, Void, Void> {
    
    private ProgressDialog mDialog;
    
    protected void onPreExecute() {
        Log.d(TAG, " pre execute async");
        mDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Retrieving data ...", true);
    
    }
    
    protected void onProgressUpdate(Void... progress) {
        Log.d(TAG, " progress async");     
    }
    
    @Override
    protected Void doInBackground(MyActivity... params) {
        // TODO Auto-generated method stub
        return null;
    }
    
    protected void onPostExecute(Void result) {
        Log.d(TAG, " post execute async");
        mDialog.dismiss();
    }
    }
    

3 个答案:

答案 0 :(得分:1)

根据你的问题,我实际上不是百分百肯定你目前对AsyncTask的理解,所以这可能是你已经知道的一些东西,但是对我不满。

“这是在另一个任务中还是在我的onCreate方法中?”: AsyncTask是一个类,您应该将其子类化为您需要的类,它不是可以在onCreate中内联的一段代码。你可以在你的onCreate中创建一个匿名的AsyncTask类,但通常你想把它作为一个私有的内部类或它自己的类。

至于何时调用方法;你不是生命周期事件。

在开始后台工作之前,在UI线程上调用

onPreExecute(),并且可以执行修改组件以显示进度或启动对话框等操作。

doInBackground(Params...)是在另一个线程的后台运行的主要方法,在这里做你的工作。 请勿尝试在此处修改用户界面

onPostExecute(Result)是您的任务完成后再次在UI线程上运行的时间。这是您应该处理UI更新的地方。

您只需调用execute(Params..),它将启动AsyncTask,将您放入的对象作为参数传递给任务的doInBackground(Params...)方法。所以关于什么作为params的答案是你需要在doInBackground(Params...)中访问的任何内容。

这应该是一个体面的概述,但你应该看看the docs

答案 1 :(得分:0)

<强> 1。我会在参数中加入什么 这取决于。 First参数是任务将采用的内容。 最后一个通用是它将返回的内容。

2.这是在另一个类中还是在我的主要oncreate方法中。当您希望任务运行时,可以调用execute方法。实现可以在Activity类中,也可以在不同的.java文件中。

3.我什么时候打电话给这些方法? 您只需调用execute方法。这将使任务在后台运行。然后,任务完成后将调用onPostExecute。

这是一个例子

private class UpdateFeedTask extends AsyncTask<String, Void, DataReturnType> {
    @Override
    protected DataReturnType doInBackground(String... params) {
        String url = params[0];
        //Get data from URL

    }

    @Override
    protected void onPostExecute(ReturnDataType result) {
        //Do something with result
    }
}

然后使用execute("http://foo.com")

调用任务

同时将android:configChanges=true添加到清单中的Activity。这将确保在任务仍在后台运行时不会终止活动。否则,任务将完成并报告回null活动,除非您告诉任务回调新活动。

答案 2 :(得分:0)

要启动AsyncTask,只需转到

即可
(new UpdateFeedTask()).execute(activityInstance);

它可以放在任何你想要的地方,不过你把它放在哪里可能会限制你想要与之交互的变量和对象的访问。例如。私有内部类可以访问它们,而一个全新的类可能没有那么容易访问。

doInBackground(MyActivity... params)

是您传递到execute()函数的参数所在的位置,您可以通过params[0]访问它。

除了execute()之外,你不应该调用AsyncTask类中的任何方法。