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 に答える