在Android平板电脑中没有调用Asynctask DoInBackground()

dav*_*e21 6 android android-asynctask

在android上的应用程序上工作我使用了Asynctask类,当我在2.3.5上运行的Android设备上测试时工作正常,但是我面临的问题是,同样不能用于我的平板电脑4.0.4

在测试时,要知道prexecute()被调用但doInbackground()没有被调用,但是在设备上调用了doInbackground()(2.3.5).

我相信这个问题的原因之一是Tablet的处理器比设备的处理器要快得多,所以可能是一些线程问题,dats为什么要解决这个问题,我使用了一些标志,并使用了Thread.sleep()在一个while循环中,这样当条件为真时,它可以工作,但没有运气,我陷入循环本身.这是我的代码:

MyAsyncTask object = new MyAsyncTask (MainActivity.this);
runOnUiThread(new Runnable() {
    public void run() {         

        try {
            if (object.isReady() || !object.isStarting()) {
                return;
            }

            object.execute();

            do {
                Thread.sleep(1000);             
            } while (!object.isReady() && object.isStarting());

            if(!object.isReady()) { 
                return;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }           
});
Run Code Online (Sandbox Code Playgroud)

AsynctaskClass:

public class MyAsyncTask extends AsyncTask<Void, Void, Boolean>{

    private ProgressDialog dialog;
    private Context context;
    private boolean isStarting = false;
    private boolean isReady = false;


    public AsyncUpdatesofJquery(Context context) {
        this.context = context;
        isStarting = true;
        isReady = false;
    }

    public boolean isStarting() {
        return isStarting;
    }

    public boolean isReady() {
        return isReady;
    }

    @Override
    protected void onPreExecute() {

        isStarting = true;
        isReady = false;
        dialog = new ProgressDialog(context); 
        dialog.setMessage("Downloading Files, Please wait...");
        dialog.show();
    }

    @Override
    protected Boolean doInBackground(Void... params) {

        isReady = true;
        isStarting = false;
        downloadFiles(context); // my background task

        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        context.startActivity(new Intent(context, NewActivity.class));
        dialog.dismiss();
        isReady = false;
        isStarting = false;

    }
}
Run Code Online (Sandbox Code Playgroud)

Tod*_*der 17

多线程模型在2.3.5和4.0.4之间变化. AsyncTask现在默认使用相同的线程在应用程序中拥有所有子类(即一次只能运行一个AsyncTask!).它在这里解释:

首次引入时,AsyncTasks在单个后台线程上串行执行.从DONUT开始,这被改为一个线程池,允许多个任务并行运行.从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误.

如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object []).

考虑到这一点,可能是另一个AsyncTask正在您的应用程序中运行,从而阻止这个开始.这可以解释为什么它在2.3.5设备上运行正常,但不适用于4.0.4平板电脑.