2011-07-12 40 views
1

我拉动了大约1500个数据地块,并将它们添加到地图视图的叠加层。我想在另一个线程中运行它,而我的程序的其余部分完成启动。我希望进度微调器只在地图部分旋转,而其加载数据图点。如何让Async在后台运行线程?

我已经搜查,发现我所需要的,但林不知道如何实现它,并在那里我的代码把它。

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

回答

1

从你的问题我其实不是一个百分之百知道你目前了解有关AsyncTask S左右,这可能是一个小一些东西,你已经知道,但我承担。

“这是否在另一个任务或我的onCreate方法?“: AsyncTask是你应该继承的类,它不是你可以在你的onCreate中创建一个匿名的AsyncTask类的代码片段,但通常你需要它无论是私有的内部类或完全自己的类

当你调用方法;你没有他们的生命周期事件

onPreExecute()被称为UI线程刚刚开始工作背景前,是一个可以做某些事情的地方,例如修改组件以显示进度,或者抛出一个对话框。

doInBackground(Params...)是在另一个线程的后台运行的主要方法,在这里做你的工作。 不要尝试在这里修改UI

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

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

这应该是一个体面的概述您的需求,但你应该检查出the docs

0

1.我会放什么PARAMS 这要看情况。第一个参数是任务将采取的内容。 最后一个泛型将返回。

2.Does此去另一个类或我的主要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在清单中的活动的任务。这将确保在任务仍在后台运行时该活动不会被终止。否则,任务将完成并向空活动报告,除非您告诉任务回调新活动。

+0

所以我追溯到我的程序进度条出现,但它不会执行任何代码,如 setContentView(R.layout.maptabview); \t \t mapView =(MapView)findViewById(R.id.mapView); \t \t Log.v(“”,“Runnnnnn”); \t \t mapView.setBuiltInZoomControls(true); \t \t mapController = mapView.getController(); \t \t mapController.setZoom(4); 它只会执行log.v,如果我从那开始。 – user758114

+0

您不想将任何对UI组件的引用放入任务(因为它可能会被终止)。我扩展了Overlay,并在我的Task中保留了一个引用。然后在任务结束时将Overlay添加到地图叠加列表中。 –

0

要启动的AsyncTask,您只需去

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

它可以去任何你想要的话,虽然你把它可能会限制访问的变量和要与交互的对象。例如。私人内部班级将可以访问他们,而全新的班级可能不像访问那么容易。

doInBackground(MyActivity... params) 

是其中参数传递进​​功能会去,并且你可以通过params[0]访问它。

你不应该叫中的AsyncTask类的任何方法,除了​​。

+0

所以我追溯了我的程序进度条出现,但它不会执行任何代码,如setContentView(R.layout.maptabview); mapView =(MapView)findViewById(R.id.mapView); Log.v( “”, “Runnnnnn”); mapView.setBuiltInZoomControls(真); mapController = mapView.getController(); mapController.setZoom(4);它只会执行log.v,如果我从那开始 – user758114