Android startactivity会冻结该应用

时间:2017-02-01 08:16:01

标签: android android-activity ui-thread

我制作了非常简单的应用。基本上我有活动A,如果按下按钮则启动活动B.所以这里是代码

openMapFAB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), MapActivity.class);
                intent.putExtra("routeId", id);
                startActivity(intent);
            }
        });

但这就是问题所在。活动B很重(它基本上是打开地图(mapsforge)并做其他繁重的计算)。因此,当按下按钮时,我的UI会冻结大约4秒,然后我会打开活动B.我想展示一些动画,比如圈子进度条或类似的东西。那么是否可以在UI线程中启动活动?

这是我到目前为止所尝试的内容

 new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (progressStatus < 100) {
                            progressStatus += 25;
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    //animation code
                                }
                            });

                            try {
                                Thread.sleep(1600);
                                if (progressStatus == 100){
                                    Intent intent = new Intent(getActivity(), MapActivity.class);
                                    intent.putExtra("routeId", id);
                                    startActivity(intent);
                                }

                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();

然而,这并不是我所需要的。任何解决方案或建议?

2 个答案:

答案 0 :(得分:0)

  

1)因此可以不在UI线程中启动活动

应仅在主UI线程中处理活动。您将无法在其他线程中启动活动。即使在后台线程中处理数据之后,也可以使用runOnUiThread来调用或推送活动方法

如果您在主线程中执行长时间操作,Android将抛出ANR

  

2)然而,这并不是我所需要的。任何解决方案或   建议?

现在,另一种方法是使用AsyncTaskIntentService在后台对您的活动进行大量操作,并显示进度条直到这些操作完成。

完成此操作后,将数据发布到MapActivity。

1)Sample Intent Service implementation

2)Sample AsyncTask example

onCreate上的AsyncTask示例如下

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new BackAsync().execute("URL");
}
private String getURLDetailsTitle(String url) {
  //Retrieve data from external URL
}
//AsyncTask to fetch data from URL called inside onCreate
private class BackAsyncextends AsyncTask<String, String, String> {

    @Override
    protected String doInBackground(String... urls) {
        String str = getURLDetailsTitle(urls[0]);
        while(true) {
           publishProgress(str);

        }
        return str;
    }

    @Override
    protected void onProgressUpdate(String... progress) {
        //update progress
    }

    protected void onPostExecute(Long result) {
         //update UI changes
     }

答案 1 :(得分:0)

使用AsyncTask并在doInBackground方法中启动进度条并在onPostExecute方法中关闭它。