我有一个左侧菜单的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任务和片段管理器。
有什么想法吗?感谢。
答案 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}}。希望我解释得很好,因为英语不是我的第一语言。