首頁 / 浏覽問題 / 移動GIS / 問題詳情
移動端workspace打開smwu文件失敗
4EXP 2025年04月22日

sdk環境爲(wéi / wèi) 11i,jar包版本爲(wéi / wèi)v1111

在(zài)項目中剛開始創建時(shí)是(shì)沒有問題的(de),但多次退出(chū)打開後,會出(chū)現

Workspace打不(bù)開smwu文件
WorkspaceConnectionInfo _wkInfo = m_workspace.getConnectionInfo();
//設置服務地(dì / de)址
_wkInfo.setServer(SuperMapConfig.DEFAULT_DATA_PATH + m_prjId + "/" + m_prjId + ".smwu");
//工作空間名字
_wkInfo.setName(m_prjId);
//工作空間類型
_wkInfo.setType(WorkspaceType.SMWU);
if (!m_workspace.open(_wkInfo)) {
    message.what = 3;
    message.obj = "line#446工作空間打開失敗";
    m_handler.sendMessage(message);
    return;
}

現在(zài)特别容易出(chū)現這(zhè)種問題的(de)手機爲(wéi / wèi)HUAWEI Pura 70 pro+ ,Harmonyos 版本:4.2.0 在(zài)小米手機也(yě)類似出(chū)現這(zhè)種問題但不(bù)多,這(zhè)是(shì)操作的(de)問題還是(shì)框架的(de)問題,因爲(wéi / wèi)在(zài)退出(chū)當前工作路徑時(shí)框架釋放資源過程比較慢。

1個(gè)回答

看代碼片段邏輯沒有問題,提到(dào)多次打開才會出(chū)現的(de)問題,懷疑上(shàng)上(shàng)下文多次交互的(de)邏輯問題,有幾點需要(yào / yāo)确認排查下:

1、workspace對象不(bù)支持同時(shí)打開多個(gè)smwu文件,每次退出(chū)是(shì)否有關閉smwu文件的(de)打開,關閉後再打開smwu文件。每次操作結果日志記錄下。看邏輯是(shì)否正确。

2、如果smwu打開結果是(shì)失敗,看看sdk層面日志是(shì)否有報錯,需要(yào / yāo)确保smwu文件路徑正确、類型正确、工作空間名稱是(shì)唯一(yī / yì /yí)不(bù)重複的(de)。
1,615EXP 2025年04月22日

首先,謝謝你的(de)答複

打開smwu文件失敗并不(bù)是(shì)經常出(chū)現的(de),出(chū)現問題時(shí)因不(bù)是(shì)第一(yī / yì /yí)現場很難查看報錯日記,唯一(yī / yì /yí)知道(dào)是(shì)smwu文件可能是(shì)已經損壞了(le/liǎo),在(zài)workspace上(shàng)打不(bù)開或者說(shuō)workspace.open(prjectPath)爲(wéi / wèi)false。(在(zài)SuperMap iDesktopX 11i是(shì)可以(yǐ)打開獲取數據的(de))
在(zài)我使用workspace.open打開“損壞的(de)smwu”時(shí)是(shì)沒有報錯信息的(de),隻是(shì)返回false。

下面是(shì)代碼和(hé / huò)輸出(chū)信息。

代碼:(s2025-04-11-2.smwu爲(wéi / wèi)損壞文件,2025-04-08-sadaw.smwu是(shì)正常工作空間加載的(de),他(tā)是(shì)可以(yǐ)被workspace加載)

//        String filePath=Constant.SDCARD+"/Download/smwuTest/0408/2025-04-08-sadaw.smwu";
        String filePath=Constant.SDCARD+"/Download/smwuTest/0411/s2025-04-11-2.smwu";
        boolean isExist=new File(filePath).exists();
        if (!isExist){
            Log.e(TAG,"加載"+filePath+"文件失敗");
            finish();
            return;
        }
        mapView=findViewById(R.id.mapview);
        findViewById(R.id.refreshBtn).setOnClickListener(this);
        findViewById(R.id.test).setOnClickListener(this);
        line=findViewById(R.id.line);
        sensorManager=(SensorManager) getSystemService(SENSOR_SERVICE);
        zoomControls=findViewById(R.id.zoom);
        workspace=new Workspace();
        workspace.setCaption(NAME);
        workspace.setDescription(NAME);

        WorkspaceConnectionInfo info=workspace.getConnectionInfo();
        info.setServer(filePath);
        info.setType(WorkspaceType.SMWU);
        info.setName(NAME);


        boolean state = workspace.open(info);
        mapControl=mapView.getMapControl();
        map=mapControl.getMap();
        map.setWorkspace(workspace);
        Maps maps=workspace.getMaps();
        if (maps.getCount()<=0){
            Log.e(TAG,"圖層缺失");
            finish();
            return;
        }
        try {
            map.open(maps.get(0));
        }catch (Exception e){
            finish();
        }

Logcat打開s2025-04-11-2.smwu的(de)輸出(chū)信息

2025-04-22 16:42:56.943 17704-17704 ziparchive              com.tianchi.test0414suwu             E  Zip: lseek on fd -2 failed: Bad file descriptor
2025-04-22 16:42:56.945 17704-17704 hi.test0414suwu         com.tianchi.test0414suwu             I  type=1400 audit(0.0:160987): avc: denied { open } for path="/system/etc/mumu-configs/currentApp" dev="sdc3" ino=5112230 scontext=u:r:untrusted_app:s0:c179,c256,c512,c768 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1 app=com.tianchi.test0414suwu
2025-04-22 16:42:57.475 17704-17704 Thread-1                com.tianchi.test0414suwu             I  type=1400 audit(0.0:160988): avc: denied { connectto } for path="/dev/socket/dnsproxyd" scontext=u:r:untrusted_app:s0:c179,c256,c512,c768 tcontext=u:r:init:s0 tclass=unix_stream_socket permissive=1 app=com.tianchi.test0414suwu
2025-04-22 16:42:57.589 17704-17704 MainActivity            com.tianchi.test0414suwu             D  license is valid
2025-04-22 16:42:57.681 17704-17704 MainActivity            com.tianchi.test0414suwu             E  圖層缺失
2025-04-22 16:42:57.687 17704-17704 Choreographer           com.tianchi.test0414suwu             I  Skipped 44 frames!  The application may be doing too much work on its main thread.
2025-04-22 16:42:57.719 17704-17781 Supermap                com.tianchi.test0414suwu             I  true
2025-04-22 16:42:57.828 17704-17785 Supermap                com.tianchi.test0414suwu             I  true
2025-04-22 16:42:57.979 17704-17788 Supermap                com.tianchi.test0414suwu             I  true
2025-04-22 16:42:59.674 17704-17704 Choreographer           com.tianchi.test0414suwu             I  Skipped 114 frames!  The application may be doing too much work on its main thread.

還有就(jiù)是(shì)“下文多次交互”具體的(de)操作是(shì)什麽呢。
“ Zip: lseek on fd -2 failed: Bad file descriptor”提示是(shì)指有個(gè)zip文件解壓失敗?

日志信息看,沒有與imobile for android組件接口的(de)報錯提示。

從代碼裏看 isExist、state 的(de)值都爲(wéi / wèi)true嗎?如果爲(wéi / wèi)false,對應的(de)smwu文件第二次是(shì)否能打開?

下文多次交互”是(shì)指是(shì)否在(zài)多處調用 workspace.open打開同一(yī / yì /yí)個(gè)smwu文件。程序關閉或切換smwu文件時(shí),需要(yào / yāo)調用workspace.close接口将當前工作空間關閉。
你好,

在(zài)打開正常的(de)smwu文件(2025-04-08-sadaw.smwu),也(yě)會出(chū)現Zip: lseek on fd -2 failed: Bad file descriptor這(zhè)個(gè),确定是(shì)workspace能打開的(de),isExist=true,state=true

在(zài)打開損壞的(de)smwu文件(s2025-04-11-2.smwu),workspaced打不(bù)開,isExist=true,state=false

在(zài)項目工作空間推出(chū)去時(shí)的(de)代碼設置:

@Override
protected void onDestroy() {
    super.onDestroy();
    try {
        if (m_map != null) {
            m_map.save();
        }
        if (m_workspace != null) {
            m_workspace.save();
        }
        LogUtills.i(TAG, "onDestroy = save()");

    } catch (Exception e) {
        LogUtills.i(TAG, "onDestroy" + e.getMessage());
    } finally {
        if (m_map != null) {
            m_map.close();
            m_map = null;
            m_mapControl.dispose();
        }
        if (m_workspace != null) {
            m_workspace.close();
            m_workspace.dispose();
            m_workspace = null;
        }
        EventBus.getDefault().unregister(this);
    }
    LogUtills.i(TAG, "onDestroy()" + this.toString());
}
在(zài)MapActivity退出(chū)時(shí)執行onDestroy()中執行資源釋放,在(zài)資源釋放過程中是(shì)否會有耗時(shí)?,如在(zài)MapActivity執行onDestroy()退出(chū)後,用戶馬上(shàng)打開新MapActivity相同工作空間這(zhè)會不(bù)會産生smwu文件損壞從而(ér)導緻打不(bù)開?

還有就(jiù)是(shì)在(zài)公司項目中smwu文件打開是(shì)在(zài)線程池中進行操作的(de),假如用戶在(zài)打開smwu文件的(de)過程中Activity馬上(shàng)退出(chū),線程還在(zài)執行,但Activity onDestroy()已經被執行了(le/liǎo),可能會存在(zài)supermap資源沒有被釋放再次打開,也(yě)會出(chū)現smwu文件損壞從而(ér)導緻打不(bù)開?

下面是(shì)公司項目打開smwu的(de)代碼,會有點亂(畢竟是(shì)有幾代主人(rén))

...