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

时间:2017-02-26 17:35:15

标签: 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会产生不正确的行为而unsigned apk的行为正常?如何纠正这个?

1 个答案:

答案 0 :(得分:2)

首先:从不Activity传递给AsyncTask,当AsyncTaskActivity内持续存在时,会造成内存泄漏娱乐和被认为是不好的做法。如果您必须传递数据,请使用类似EventBus的内容。

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

在任何情况下,您的示例中都有很多未保存的代码。例如,while(!shouldProceed)部分是残暴的。

通常,您没有使用AsyncTask作为indended。您应该重写它以使用onPostExecute而不是上面提到的while循环启动器。有关如何构建AsyncTask并遵循该结构的详细信息,请参阅here

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