【问题标题】:Asynctask executes properly in debug version, but fails to update UI in release version (signed apk)Asynctask 在调试版本中正确执行,但在发布版本中无法更新 UI(签名 apk)
【发布时间】:2017-02-26 17:35:15
【问题描述】:

我正在使用 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 行为正常?如何纠正?

【问题讨论】:

  • 首先:永远不要将您的活动传递给您的 asyncTask,这会在异步任务在活动重新创建时持续存在时造成内存泄漏。
  • 感谢您的意见。但是知道为什么这在未签名的apk中工作而不是在签名的apk中工作吗?有什么办法可以解决这个问题?
  • 这可能是因为系统对非调试应用程序的限制更严格。您的示例中有很多未保存的代码,例如 while(!shouldProceed) 部分很糟糕。您没有使用 AsyncTask 作为 indended。您应该重写它以使用 onPostExecute 而不是上面提到的 while 循环开始。
  • 这可能只是侥幸,因为这个代码示例有很多地方可能出错。我会清理代码并使其符合 AsyncTask 规范,然后重试。如果还是不行,告诉我,我可以看看
  • 一年多以前我就在做这个,但我仍然不明白为什么我把那个循环放在那里。它当时并没有影响我的应用,因为它主要在 Android 4.4 和 5 上运行,但该错误出现在 Android 6.0 的设备中。

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


【解决方案1】:

首先:切勿将您的Activity 传递给AsyncTask,当AsyncTaskActivity 娱乐中持续存在时,这会造成内存泄漏,并且被认为是不好的做法。如果您必须传递数据,请改用EventBus 之类的东西。

您的代码示例可能会因为系统对非调试应用程序的更严格限制而失败。

无论如何,您的示例中有很多未保存的代码。例如while(!shouldProceed) 部分很糟糕。

通常您不会使用 AsyncTask 作为 indended。您应该重写它以使用 onPostExecute 而不是上面提到的 while 循环作为初学者。请参阅here 了解有关 AsyncTask 应如何构建并遵循该结构的更多信息。

正如 cmets 中所讨论的,清理 AsyncTask 解决了您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多