0

我有一个 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 任务和片段管理器。

有任何想法吗 ?谢谢。

4

1 回答 1

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在后台进度条中与服务器通信,显示给用户。希望我解释得足够好,因为英语不是我的第一语言。

于 2014-08-21T10:50:10.150 回答