【发布时间】:2016-09-22 15:12:48
【问题描述】:
问题
您好,我正在为 Titanium 创建一个 Android 和 iOS 模块,它有一个 sendLog 方法,该方法将一些任意 JSON 数据发送到服务器,如果它与某些预定义的过滤器匹配,则返回一个 URL。 URL 应在带有 web 视图的模态对话框中打开。
我编写了原生 iOS 和 Android 库并将它们包装为 Titanium 模块。在 iOS 上一切正常,但在 Android 上我无法打开对话框(请参阅下面的错误堆栈跟踪)。现在有一条日志消息总是触发相同的网页进行测试。在 Android 上,它只是默默地失败。
测试用例
var mupets = require("be.iminds.mupets");
mupets.initialize("wappr", "http://tocker.iminds.be:3000/log/report.json", 1, 100, 3);
var esmLog = {
bar: "foo"
};
mupets.sendLog("es-test-01",JSON.stringify(esmLog));
在这段代码之后(最多大约 10 秒后),模块应该显示一个原生对话框,其中包含以下网页:http://tocker.iminds.be:3000/es/sheets/test-01/index.html
相反,这是我一直得到的错误:
日志
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1411)
at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1429)
at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687)
at android.app.BackStackRecord.commit(BackStackRecord.java:663)
at android.app.DialogFragment.show(DialogFragment.java:256)
at be.iminds.mupets_client_android.logging.plugins.OutHttp.getEsm(OutHttp.java:122)
at be.iminds.mupets_client_android.logging.plugins.OutHttp$1.success(OutHttp.java:78)
at be.iminds.mupets_client_android.HttpClient$1$1.onResponse(HttpClient.java:76)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
这是导致错误的 Android 代码:
Activity activity = (Activity) context;
EsmDialogFragment esmDialogFragment = EsmDialogFragment.newInstance(new EsmDialogListener() {
@Override
public void submit(String type, JsonObject result) {
Mupets.sendLog(type, result);
esmShown = false;
}
@Override
public void onCancel(JsonObject cancelled) {
super.onCancel(cancelled);
Mupets.sendLog("ESM_cancelled", cancelled);
esmShown = false;
}
}, url, true);
FragmentTransaction transaction = activity.getFragmentManager().beginTransaction();
Fragment prev = activity.getFragmentManager().findFragmentByTag(EsmDialogFragment.ESM_DIALOG_FRAGMENT);
if (prev != null) {
transaction.remove(prev);
}
transaction.addToBackStack(null);
Log.v(TAG, "Pre-show fragment");
esmDialogFragment.show(transaction, EsmDialogFragment.ESM_DIALOG_FRAGMENT);
Log.v(TAG, "Post-show fragment");
Titanium 是否不允许使用 Fragments/或要求您在特定点调用 Dialog.show()?该错误涉及“...在 onSaveInstanceState 之后”,但如果我没有创建活动,我不知道如何在 onSaveInstanceState 之前调用它,以及为什么在本机 Android 应用程序中使用代码时代码有效。
这是一个 Titanium 示例项目,其模块应在打开后显示对话框: https://www.dropbox.com/s/0v77xd5gllv6kb3/testModule.zip?dl=1
【问题讨论】:
标签: android module appcelerator appcelerator-titanium dialogfragment