Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android在活动之后做的事情是可见的_Android_Android Asynctask_Android Activity_Progressdialog_Android Progressbar - Fatal编程技术网

Android在活动之后做的事情是可见的

Android在活动之后做的事情是可见的,android,android-asynctask,android-activity,progressdialog,android-progressbar,Android,Android Asynctask,Android Activity,Progressdialog,Android Progressbar,我有一个带按钮的活动。单击按钮时,会启动一个新活动,在此活动中,会从web获取各种数据。但当我单击按钮时,第一个活动会保持一段时间,3-4秒后,第二个活动会以就绪数据开始。显然,在第二个活动可见之前,应用程序会尝试获取数据。但首先,我希望第二个活动对用户可见,之后必须开始获取数据。 我检查了活动生命周期,并将抓取替换为onStart(),但不起作用 @Override protected void onStart() { super.onStart();

我有一个带按钮的活动。单击按钮时,会启动一个新活动,在此活动中,会从web获取各种数据。但当我单击按钮时,第一个活动会保持一段时间,3-4秒后,第二个活动会以就绪数据开始。显然,在第二个活动可见之前,应用程序会尝试获取数据。但首先,我希望第二个活动对用户可见,之后必须开始获取数据。 我检查了活动生命周期,并将抓取替换为onStart(),但不起作用

 @Override
 protected void onStart() {
          super.onStart();
          //Fetch data
 }
我该怎么做

以下是我的全部代码(仅第二个活动):

public类GuzergahActivity扩展了android.support.v4.app.FragmentActivity{
私人谷歌地图;
私人古泽尔加酒店;
私有网络视图;
私人影像视图;
私人对话;
私人int标志;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
覆盖转换(0,0);
setContentView(R.layout.guzergah);
flag=this.getIntent().getExtras().getInt(“flag”);
setupmapifneed();
setUpView();
}
@凌驾
受保护的void onResume(){
super.onResume();
setupmapifneed();
}
@凌驾
受保护的空onDestroy(){
如果(对话框!=null){
dialog.dismise();
}
super.ondestory();
}
私有void setUpMapIfNeeded(){
//执行空检查以确认尚未实例化映射。
if(map==null){
map=((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.guzergah_fragment)).getMap();
if(map!=null){
setUpMap();
}
}
}
私有void setUpMap(){
试一试{
字符串结果=新建MyNewTask().execute().get();
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(执行例外){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
覆盖。设置覆盖(地图);
移动摄像机地图(CameraUpdateFactory.newLatLngZoom(新LatLng(39.910526,32.804435),15));
animateCamera(CameraUpdateFactory.zoomTo(10),2000年,空);
}
私有void setUpView(){
//绑定imageview、webview…并设置其功能
}
私有类MyNewTask扩展了AsyncTask
{
@凌驾
受保护的void onPreExecute()
{
dialog=新进度对话框(GuzergahActivity.this);
对话框。setUndeterminate(true);
对话框。可设置可取消(false);
setMessage(“正在下载!请稍候…”);
dialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…参数)
{
/*获取数据在此类中-GuzergahOverlay*/
叠加=新的GuzergahOverlay(标志);
返回“完成”;
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
super.onPostExecute(结果);
Log.i(“结果”,“结果+结果”);
如果(结果!=null){
dialog.dismise();
}
}
}//结束MyNewTask
}
公共类GuzergahOverlay{
beytepe_kampusu私人市场选择;
sihhiye_kampusu私人MarkerOptions;
私有数组列表行;
私人ArrayList站点;
公共GuzergahOverlay(int模式){
beytepeÜu kampusu=new MarkerOptions().position(new LatLng(39.87159,32.735435)).title(“HacettepeÜniversitesi beytepe Yerleşkesi”).icon(BitmapDescriptorFactory.fromResource(R.drawable.markerşbeytepe));
sihhiyeıu kampusu=new MarkerOptions().position(new LatLng(39.931599,32.862365)).title(“HacettepeÜniversitesi Sıhhıyereşkesi”).icon(BitmapDescriptorFactory.fromResource(R.drawable.markerşsihhiye));
GetLinesSandops(模式);//这里是获取地理点并准备线和停止ArrayList
}
私有void GetLinesAndOps(int模式){
//从Parse.com获取数据
//填充行并停止ArrayList
}
公共void setOverlay(谷歌地图){
地图添加标记(beytepe_kampusu);
addMarker地图(sihhiye_kampusu);
用于(多段线选项多段线:线){
map.addPolyline(多段线);
}
用于(标记选项标记:停止){
map.addMarker(marker);
}
}
}

在上面的代码中,当我单击按钮时,第一个活动将保持一段时间,第二个活动在获取数据完成时可见。进度对话框仅在几毫秒内可见。您应该将数据获取方法移动到一个窗口中。永远不要在UI线程上从远程源获取数据。如果以这种方式将该操作移动到后台线程中,UI将具有更高的优先级,并且应快速加载,同时仍允许异步任务完成。您甚至可以在onCreate或onStart中启动任务,您应该会看到更好的性能。

听起来好像您正在UI线程中运行所有代码。如果有更多的代码能够给出一个更好的例子就好了

在第二个活动中:

    private class BackgroundTask extends AsyncTask<Void, Void, Void> {

    // Before running code in separate thread
    @Override
    protected void onPreExecute() {
        // setup loading dialog
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // do long running code
        return null;
    }

    // after executing the code in the thread
    @Override
    protected void onPostExecute(Void arg) {
        // dismiss your dialog

    }

}
编辑:

现在我已经看到了您的代码,我建议您尝试以下内容:

    private void setUpMap(){
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new      LatLng(39.910526,32.804435),15));
        map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
        new Handler().postDelayed(new Runnable() {
            public void run() {
                try {
                    String result = new MyNewTask().execute();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                /*
                 * you should move this call to onPostExecute
                 * then you will not need to call execute().get() 
                 * which takes away the advantage of AsyncTask
                 * as it then is run on UI thread
                 */

                overlay.setOverlay(map);
            }
        }, 2000);

    }

设置地图是一项UI繁重的任务,因此根据我的经验,在加载标记等之前等待一段时间会更好。此外,这应该能够使对话框在被取消之前正确显示。

如果我成功,可能会出现第二个活动中的progressdialog,等待回复,我用密码编辑了我的问题。你能再看一次吗?@Kurt你的编辑看起来你的方向是对的。现在有什么问题吗?我在问题的结尾说“用上面的代码,当我点击按钮时,第一次激活”
new BackgroundTask().execute();
    private void setUpMap(){
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new      LatLng(39.910526,32.804435),15));
        map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
        new Handler().postDelayed(new Runnable() {
            public void run() {
                try {
                    String result = new MyNewTask().execute();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                /*
                 * you should move this call to onPostExecute
                 * then you will not need to call execute().get() 
                 * which takes away the advantage of AsyncTask
                 * as it then is run on UI thread
                 */

                overlay.setOverlay(map);
            }
        }, 2000);

    }