簡體   English   中英

java.lang.IllegalStateException:片段 ProgressDialog{x) 未與片段管理器關聯

[英]java.lang.IllegalStateException: Fragment ProgressDialog{x) not associated with a fragment manager

我將 android 源從 API8 遷移到 API32。 因為 progressdialog class 在 API26 中被棄用了,所以我想自定義它。 我搜索並創建如下 url: https://qiita.com/Uchikoba/items/478d604f417465700ba1

我復制它並在我的應用程序中創建 ProgressDialog class。 我在同一個 class 中顯示並關閉它,沒有任何問題。

public class BaseActivity extends AppCompatActivity   {
protected ProgressDialog mProgressDialog = null;

  protected void callServerApi(
        ApiHttpClient client,
        String url, RequestParams params, int timeoutsec, boolean isAuth,
        AsyncHttpResponseHandler handler, String dmsg) {

    try {
         mProgressDialog = ProgressDialog.newInstance(msg);
        mProgressDialog.setCancelable(true);
        mProgressDialog.show(getSupportFragmentManager(), "tag");
        dosomething();
    }......

   private void dosomething() {
    new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... aVoid) {
            try {
                Thread.sleep(5000);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            if (mProgressDialog == null) return;
             mProgressDialog.dismiss();
             mProgressDialog = null;
        }
    }.execute();
}

}

但我想根據考慮使用 ProgressDialog。

  1. 顯示進度對話框
  2. 與服務器通信
  3. 獲取響應數據並關閉進度對話框

帳戶活動

public class AccountActivity extends BaseActivity {
 ApiHttpClient mApiClient = new ApiHttpClient(ApiCookieStore.getCookieStore());


public void callApiAuthentication(String uid, String pwd, String domain) {

    RequestParams params = mApiClient.makeBaseRequestParams("account");
    params.add("cj_uid", uid);
    params.add("cj_pwd", pwd);
    params.add("cj_domain", domain);
    AsyncHttpResponseHandler handler = new AuthResponseHandler(this, uid, pwd, domain);

    callServerApi(
            mApiClient, "http://www.sample.com/logon.do", params,
            1000, false,handler, "Now authenticating...");

}
    public void saveInputText(String id, String pass, String domain)
    throws SmartAppCipherException {

    SmartAppPreference pref = new SmartAppPreference(this);
    
    pref.setAccount(id, pass, domain);
}

}

基礎活動

public class BaseActivity extends AppCompatActivity   {
protected ProgressDialog mProgressDialog = null;


protected void callServerApi(
        ApiHttpClient client,
        String url, RequestParams params, int timeoutsec, boolean isAuth,
        AsyncHttpResponseHandler handler, String dmsg) {

    try {
        mProgressDialog = ProgressDialog.newInstance(msg);
        mProgressDialog.setCancelable(true);
        mProgressDialog.show(getSupportFragmentManager(), "tag");

        client.post(url, params, handler, timeoutsec * 1000);
    }
    catch(Exception  e) {
     ...
    }
    
}

public void dismissProgress() {     
    try {
        if (mProgressDialog == null) return;
        mProgressDialog.dismiss();
        mProgressDialog = null;

        }
    catch(IllegalArgumentException e) {
          ...
    }
}

AuthResponseHandler.java:

public class AuthResponseHandler extends AsyncHttpResponseHandler {

private AccountActivity mParentActivity = null;
private String mInputID;
private String mInputPassword;
private String mInputDomain;

protected AuthResponseHandler() {}
public AuthResponseHandler(AccountActivity parent, String id, String pwd, String domain) {
    mParentActivity = parent;
    mInputID = id;
    mInputPassword = pwd;
    mInputDomain = domain;
}

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {

    try {
        String responseBodyString = new String(responseBody);
        JsonReader jsr = new JsonReader(new StringReader(responseBodyString));
        Gson gson = new Gson();
        AuthResponse response = gson.fromJson(jsr, AuthResponse.class);
        Logger.d("responseBodyString", responseBodyString);
        if (response.getStatus() != 1) {

            disptachApiError(response.getApiError());
            return;
        }
        mParentActivity.saveInputText(mInputID, mInputPassword, mInputDomain);
        mParentActivity.finish();
    }
    catch(Exception e) {
        Logger.d("AuthResponseHandler.onReceive", "failed", e);
    }
}

    @Override
public void onFinish() {
    
    mParentActivity.dismissProgress();
}

}

build.gradle

dependencies {
implementation "androidx.constraintlayout:constraintlayout:2.1.3"
implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0"
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.loopj.android:android-async-http:1.4.9'
implementation 'androidx.work:work-runtime:2.7.1'
implementation 'androidx.fragment:fragment:1.4.1'
implementation 'androidx.core:core:1.7.0'
implementation 'com.google.code.gson:gson:2.9.0'
implementation "androidx.activity:activity:1.4.0"
implementation files('libs/android-viewbadger.jar')

我運行此源,但在 AuthResponseHandler.java 中調用 mParentActivity.dismissProgress() 時。 java.lang.IllegalStateException 已經發生

java.lang.RuntimeException: java.lang.IllegalStateException: Fragment ProgressDialog{3a61bf9} (133e25a6-7db0-4a8f-8978-48deefd6308a) not associated with a fragment manager.
    at com.loopj.android.http.AsyncHttpResponseHandler.onUserException(AsyncHttpResponseHandler.java:304)
    at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:395)
    at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
 Caused by: java.lang.IllegalStateException: Fragment ProgressDialog{3a61bf9} (133e25a6-7db0-4a8f-8978-48deefd6308a) not associated with a fragment manager.
    at androidx.fragment.app.Fragment.getParentFragmentManager(Fragment.java:1059)
    at androidx.fragment.app.DialogFragment.dismissInternal(DialogFragment.java:352)
    at androidx.fragment.app.DialogFragment.dismiss(DialogFragment.java:309)
    at com.fujitsu.campus.smartapp.base.common.app.BaseActivity.dismissProgress(BaseActivity.java:173)
    at com.fujitsu.campus.smartapp.base.config.account.AuthResponseHandler.onFinish(AuthResponseHandler.java:91)
    at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:368)

誰能幫我?

這個問題已經解決。

僅使用 DialogFragment.show(fm,tag) 替換 ProgressDialog.show(fm,tag)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM