【问题标题】:AsyncTask "onPostExecute" method never calledAsyncTask“onPostExecute”方法从未被调用
【发布时间】:2015-03-24 20:10:52
【问题描述】:

我不确定我做错了什么,但 onPostExecute 永远不会被调用。

我阅读了很多类似问题的答案,但没有一个对我有用。

我试图将 return 声明替换为 void 和 Integer 以及许多对其他人有用但对我无效的疯狂东西。

我的异步任务类:

    import static java.util.Arrays.asList;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.widget.ImageView;

public class Async extends AsyncTask<Result, Void, Integer> {

            private static final String TAG = "UpdateUI";
            private static final int DELAY = 500;
            public static ImageView A1, A2, A3, A4, A5, A6, A7, A8, B1, B2, B3, B4, B5, B6,
                    B7, B8, C1, C2, C3, C4, C5, C6, C7, C8;
            public int dsc1, dsc2, dsc3, dsc4, dsc5, dsc6, dsc7, dsc8, pole;
            public static Resources mResources;
            public static List<ImageView> A ,B ,C ;
            private Activity mActivity;
            public ArrayList<Result> arr;

            Async(Activity activity) {
                mActivity = activity;   
            }

            @Override
            protected Integer  doInBackground(Result... params) {

                initializeVariables();
                mResources =  mActivity.getResources();
                ArrayList<Result> arr = new ArrayList<Result>();
                arr.add(params[0]);
                arr.add(params[1]);


                return 1;
            }

            @Override
            protected void onPostExecute(Integer result) {


                switch (arr.get(0).getPoleNumber()) {
                case 1:
                    A.get(arr.get(0).getPole()).setImageDrawable(arr.get(0).getImg());
                    break;
                case 2:
                    B.get(arr.get(0).getPole()).setImageDrawable(arr.get(0).getImg());
                    break;
                case 3:
                    C.get(arr.get(0).getPole()).setImageDrawable(arr.get(0).getImg());
                    break;
                }

                   switch (arr.get(1).getPoleNumber()) {
                    case 1:
                        A.get(arr.get(1).getPole()).setImageDrawable(arr.get(1).getImg());
                        break;
                    case 2:
                        B.get(arr.get(1).getPole()).setImageDrawable(arr.get(1).getImg());
                        break;
                    case 3:
                        C.get(arr.get(1).getPole()).setImageDrawable(arr.get(1).getImg());
                        break;
                    }

            }


            private void initializeVariables() {


                dsc1 = R.drawable.disc1;
                dsc2 = R.drawable.disc2;
                dsc3 = R.drawable.disc3;
                dsc4 = R.drawable.disc4;
                dsc5 = R.drawable.disc5;
                dsc6 = R.drawable.disc6;
                dsc7 = R.drawable.disc7;
                dsc8 = R.drawable.disc8;
                pole = R.drawable.pole;

                A1= (ImageView) mActivity.findViewById(R.id.A1);
                A2= (ImageView) mActivity.findViewById(R.id.A2);
                A3= (ImageView) mActivity.findViewById(R.id.A3);
                A4= (ImageView) mActivity.findViewById(R.id.A4);
                A5= (ImageView) mActivity.findViewById(R.id.A5);
                A6= (ImageView) mActivity.findViewById(R.id.A6);
                A7= (ImageView) mActivity.findViewById(R.id.A7);
                A8= (ImageView) mActivity.findViewById(R.id.A8);
                B1= (ImageView) mActivity.findViewById(R.id.B1);
                B2= (ImageView) mActivity.findViewById(R.id.B2);
                B3= (ImageView) mActivity.findViewById(R.id.B3);
                B4= (ImageView) mActivity.findViewById(R.id.B4);
                B5= (ImageView) mActivity.findViewById(R.id.B5);
                B6= (ImageView) mActivity.findViewById(R.id.B6);
                B7= (ImageView) mActivity.findViewById(R.id.B7);
                B8= (ImageView) mActivity.findViewById(R.id.B8);
                C1= (ImageView) mActivity.findViewById(R.id.C1);
                C2= (ImageView) mActivity.findViewById(R.id.C2);
                C3= (ImageView) mActivity.findViewById(R.id.C3);
                C4= (ImageView) mActivity.findViewById(R.id.C4);
                C5= (ImageView) mActivity.findViewById(R.id.C5);
                C6= (ImageView) mActivity.findViewById(R.id.C6);
                C7= (ImageView) mActivity.findViewById(R.id.C7);
                C8= (ImageView) mActivity.findViewById(R.id.C8);

                A = new ArrayList<ImageView>(asList(A1, A2, A3, A4, A5, A6, A7, A8));
                B = new ArrayList<ImageView>(asList(B1, B2, B3, B4, B5, B6, B7, B8));
                C = new ArrayList<ImageView>(asList(C1, C2, C3, C4, C5, C6, C7, C8));
            }
    }

我从这样的主要活动中调用它:

Async async = new Async(MainActivity.this);
async.execute(from,to); 

【问题讨论】:

  • 你怎么知道它没有被调用?您是否设置了日志或断点,特别是因为您的任何一个 switch 语句中都没有 default,这将是一个很好的第一步?
  • 它被调用,通过日志确定。您的问题出在 Swich 或 Result 类中

标签: java android android-asynctask


【解决方案1】:

你的问题是

switch (arr.get(0).getPoleNumber()) 

onPostExecute() 中,因为arrNULL

doInBackground() 中的代码行ArrayList&lt;Result&gt; arr = new ArrayList&lt;Result&gt;(); 应该是arr = new ArrayList&lt;Result&gt;();

doInBackground() 应该是这样的,

 @Override
 protected Integer  doInBackground(Result... params) {
     // doubt on this method, it should be in onPreExecute()
     initializeVariables();
     mResources =  mActivity.getResources();
     arr = new ArrayList<Result>();
     arr.add(params[0]);
     arr.add(params[1]);

     return 1;
    }

我也对initializeVariables() 有疑问,因为您正在使用应在应用程序 UI 线程中的 Activity 上下文获取资源。不在工作线程中,例如 doInbackground()

【讨论】:

  • 感谢您的快速回复,我尝试实现您的 cmets,但我没有运气,我还将“initializeVariables”移动到“onPreExecute”,但它仍然无法工作。
  • 我设置断点并在 doInBackGround 之后跟随它们,它转到 asynctask 页面的顶部并返回到 mainactivity... ****edit*** 我放置了一些日志,现在我 100% 确定它从来没有叫...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多