Asynctask 在调试版本中正确执行,但在发布版本(已签名的 apk)中无法更新 UI
Asynctask executes properly in debug version, but fails to update UI in release version (signed apk)
我正在使用 Asynctask 进行一些处理,之后 UI 列表会更新为剩余/附加项目(添加或删除案例)。
该功能在我在 Android Studio 中处理的调试 apk 中正常运行。但是,它在发布的 APK 文件中不起作用。
当我进一步分析时,我发现当我锁定和解锁屏幕,或者关闭并重新打开应用程序时,该功能显示正确的结果。它仅在产生即时更新时失败。
这就是为什么我觉得异步任务有问题的原因。
public class RefreshDisplayAsyncTask extends AsyncTask<Void, Void, Void> {
private Activity curActivity = null;
private boolean shouldProceed = false;
public RefreshDisplayAsyncTask(Activity activity)
{
curActivity = activity;
}
protected Void doInBackground(Void... params) {
//Log.d("UIBug","RefreshTask entered");
((MainActivity)curActivity).setUpList();
shouldProceed = false;
curActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
((MainActivity)curActivity).listView.setAdapter(new listArrayAdapter(curActivity,((MainActivity)curActivity).list1,((MainActivity)curActivity).list2));
shouldProceed = true;
}
});
while(!shouldProceed){}
//Log.d("UIBug","RefreshTask completed");
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void result) {
// if(progressDialog!=null)
// {
// progressDialog.dismiss();
// }
}
}
为什么签名的 apk 产生了错误的行为,而未签名的 apk 表现正常?如何纠正?
首先:从不 将您的 Activity
传递给 AsyncTask
,这会在 AsyncTask
持续存在时造成内存泄漏在 Activity
个娱乐活动中,被认为是不好的做法。如果您必须传递数据,请改用 EventBus 之类的东西。
您的代码示例可能会失败,因为系统对非调试应用程序有更严格的限制。
无论如何,您的示例中有很多未保存的代码。例如 while(!shouldProceed)
部分是残酷的。
通常您没有按预期使用 AsyncTask
。对于初学者,您应该重写它以利用 onPostExecute
而不是上面提到的 while 循环。请参阅 here 了解有关 AsyncTask 应如何构建并遵循该结构的更多信息。
如评论中所述,清理 AsyncTask
解决了您的问题。
我正在使用 Asynctask 进行一些处理,之后 UI 列表会更新为剩余/附加项目(添加或删除案例)。
该功能在我在 Android Studio 中处理的调试 apk 中正常运行。但是,它在发布的 APK 文件中不起作用。
当我进一步分析时,我发现当我锁定和解锁屏幕,或者关闭并重新打开应用程序时,该功能显示正确的结果。它仅在产生即时更新时失败。
这就是为什么我觉得异步任务有问题的原因。
public class RefreshDisplayAsyncTask extends AsyncTask<Void, Void, Void> {
private Activity curActivity = null;
private boolean shouldProceed = false;
public RefreshDisplayAsyncTask(Activity activity)
{
curActivity = activity;
}
protected Void doInBackground(Void... params) {
//Log.d("UIBug","RefreshTask entered");
((MainActivity)curActivity).setUpList();
shouldProceed = false;
curActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
((MainActivity)curActivity).listView.setAdapter(new listArrayAdapter(curActivity,((MainActivity)curActivity).list1,((MainActivity)curActivity).list2));
shouldProceed = true;
}
});
while(!shouldProceed){}
//Log.d("UIBug","RefreshTask completed");
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void result) {
// if(progressDialog!=null)
// {
// progressDialog.dismiss();
// }
}
}
为什么签名的 apk 产生了错误的行为,而未签名的 apk 表现正常?如何纠正?
首先:从不 将您的 Activity
传递给 AsyncTask
,这会在 AsyncTask
持续存在时造成内存泄漏在 Activity
个娱乐活动中,被认为是不好的做法。如果您必须传递数据,请改用 EventBus 之类的东西。
您的代码示例可能会失败,因为系统对非调试应用程序有更严格的限制。
无论如何,您的示例中有很多未保存的代码。例如 while(!shouldProceed)
部分是残酷的。
通常您没有按预期使用 AsyncTask
。对于初学者,您应该重写它以利用 onPostExecute
而不是上面提到的 while 循环。请参阅 here 了解有关 AsyncTask 应如何构建并遵循该结构的更多信息。
如评论中所述,清理 AsyncTask
解决了您的问题。