主线程延迟后加载片段

时间:2014-08-21 09:55:51

标签: android fragment fragmentmanager

我有一个左侧菜单的NavigationDrawer,当我触摸此按钮中的一个按钮时,我会加载一个像这样的新片段:

fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment,""+tagFragment).commit(); 
fragmentManager.executePendingTransactions();

我有一个使用相机实例的片段,片段加载速度比其他片段慢,如果我加载相机片段像另一个应用程序冻结一段时间,所以我想在我的上添加一个进度栏主要活动,当加载相机片段时,我使用回调删除progressView。

这样做我会显示进度条并在延迟后加载片段:

RelativeLayout layoutLoadingIndicator = (RelativeLayout)findViewById(R.id.rl_loading_indicator); 
                    layoutLoadingIndicator.setVisibility(View.VISIBLE);

Handler mainHandler = new Handler(this.getMainLooper()); 

Runnable task = new Runnable() {
                        @Override
                        public void run() {
                          fragmentManager.beginTransaction()
                          .replace(R.id.frame_container, fragment,""+tagFragment).commit(); 
                          fragmentManager.executePendingTransactions();                         }
                    };

worker.schedule(task, 2, TimeUnit.SECONDS); 

相机片段在2秒后加载,工作正常。 问题是,当我想加载一个新的片段时,它仍然是屏幕上的相机片段,片段在相机片段下方被替换。 如果我删除Runnable任务,我加载相机片段像另一个没有问题,我可以切换到其他片段。

我认为问题来自Runnable任务和片段管理器。

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:0)

使用AsyncTask可能会解决您的问题。

例如,在我的应用中,当我与服务器通信以进行登录时,我正在使用AsyncTask。我可以向您展示我的部分代码作为示例:

    public static void login(final Context c, final String username, final String password, final String apiUrl, final ILoginHandler handler) {
            UserName = username;
            new AsyncTask<Void, Void, Boolean>() {

                SecureDataClient dataClient;
                public String getLocalIpAddress() {
                    try {
                        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                            NetworkInterface intf = en.nextElement();
                            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                                InetAddress inetAddress = enumIpAddr.nextElement();
                                if (!inetAddress.isLoopbackAddress()) {
                                    String ip = Formatter.formatIpAddress(inetAddress.hashCode());
                                    Log.e(TAG, "***** IP="+ ip);
                                    return ip;
                                }
                            }
                        }
                    } catch (SocketException ex) {
                        Log.e(TAG, ex.toString());
                    }
                    return null;
                }
                @Override
                protected Boolean doInBackground(Void... params) {
                    dataClient = new SecureDataClient(username, password,apiUrl);
                    try {
                        JSONObject request = new JSONObject();
                        request.put("function", "GetNearestDataServer");
                        request.put("deviceIpAddress", getLocalIpAddress());
                        JSONObject response = dataClient.createRetriever().executeJSON(request);
                        if (response != null) {
                            dataClient.setApiLocation(response.getString("url"));
                            UserDataClient = dataClient;
                            BaseApp.devicesList = Devices.GetDevices(dataClient);
                            BaseApp.device = Devices.GetDevice(dataClient);
                            request = new JSONObject();
                            request.put("function", "GetServerActualTime");
                            response = dataClient.createRetriever().executeJSON(request);
                            if (response != null) {
                                DateTimeFormatter fmt = DateTimeFormatters.ISO8601();
                                DateTime userTime = DateTime.now(zone());
                                DateTime serverTime = fmt.parseDateTime(response.getString("server_actual_time"));
                               /* if(user == null)
                                {
                                    user = new User(c,null);
                                }
                                user.timeOffset = Seconds.secondsBetween(userTime, serverTime).getSeconds();*/
                            }
                            return true;
                        }
                    } catch (JSONException e) {
                        Log.e(TAG, "Login error", e);
                    }
                    return false;
                }
}

正如你可以看到AsynTask方法doInBackground在背景中做的事情Asynctask。在此示例中,我向用户显示了在后台进度条中与服务器进行通信的{{1}}。希望我解释得很好,因为英语不是我的第一语言。