我将android源代码从API8迁移到API32。由于API26中已弃用progressdialog类,所以我想定制它。我搜索并发现它如下url:https://qiita.com/Uchikoba/items/478d604f417465700ba1
我复制它并在我的应用程序中创建ProgressDialog类。我在同一个类中显示和关闭它,没有任何问题。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
- 显示进度对话框
- 与服务器通信
- 获取响应数据并关闭progressdialog
AccountActivity
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);
}
}
BaseActivity
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')
我运行这个源代码,但当调用mparentacactivity .遣散进程()在AuthResponseHandler.java。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)。