6

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

在测试时,知道正在调用 prexecute() 但未调用 doInbackground(),但是在设备 (2.3.5) 上调用了 doInbackground()。

我相信这个问题的原因之一是平板电脑的处理器比设备的处理器快得多,所以可能是一些线程问题,为什么,为了解决这个问题,我使用了一些标志,并使用了 Thread.sleep()在 do 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();
        }

    }           
});

异步任务类:

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;

    }
}
4

1 回答 1

17

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

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

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

考虑到这一点,您的应用程序中可能正在运行另一个AsyncTask,从而阻止了这个应用程序的启动。这可以解释为什么它在您的 2.3.5 设备上运行良好,但在您的 4.0.4 平板电脑上运行良好。

于 2012-10-12T19:03:44.353 回答