android - Asynctask 在调试版本中正确执行,但在发布版本(已签名的 apk)中无法更新 UI

标签 android android-asynctask signed-apk android-signing

我正在使用 Asynctask 进行一些处理,然后使用剩余/附加项目(添加或删除情况)更新 UI 列表。

该功能在我在 Android Studio 中处理的调试 apk 中正常工作。但是,它在发布的 APK 文件中不起作用。

当我进一步分析时,我发现当我锁定和解锁屏幕,或者关闭并重新打开应用程序时,该功能显示正确的结果。它仅无法生成即时更新。

这就是为什么我觉得asynctask有问题。

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 解决了您的问题。

关于android - Asynctask 在调试版本中正确执行,但在发布版本(已签名的 apk)中无法更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42471845/

相关文章:

android - Activity onBackPress 不显示警报对话框

javascript - Onclick 上的 href 链接文件未在 Android 移动网络应用程序中下载

java - Android - 从其他 Activity 中的 AsyncTask 调用时,ListFragment 中的上下文不起作用

android - 生成签名 APK 时出现 "androidx.legacy_legacy-support-core-utils.version collided"错误

android - Webview 在三星设备中崩溃 : Chrome 84

javascript - 在 Cordova 应用程序中实现 ProtobufJS 时出错

android - 我必须修复一个 bug nullpointerexception

android - 使用 BroadcastReceiver 启动 AsyncTask

android - admob 广告在签名的 apk 中不起作用,它在调试版本中完美运行

android - 主机名不能为空,错误 : Execution failed for task ':app:uploadCrashlyticsMappingFileRelease'