【问题标题】:AsyncTask block Unity(UI) thread issueAsyncTask 块 Unity(UI) 线程问题
【发布时间】:2016-06-05 01:26:07
【问题描述】:

这是我在OnCreate 中的主要活动:

        mUnityPlayer = new UnityPlayer(this);
        setContentView(mUnityPlayer);
        mUnityPlayer.requestFocus();

        new SimuDownloadTask(this).execute();

以下代码为SimuDownloadTask的源码:

    public class SimuDownloadTask extends AsyncTask<Void, Integer, Boolean> {

    private ProgressDialog progressDialog;
    private int count=0;
    private Context mainActivityContext;

    public SimuDownloadTask(Context context) {
        mainActivityContext=context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog=new ProgressDialog(mainActivityContext,R.style.XMNewDialog);
        progressDialog.show();
    }

    @Override
    protected Boolean doInBackground(Void... arg0) {
        while(true)
        {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int downloadPercent=doDownload();
            publishProgress(downloadPercent);
            if(downloadPercent>=500)
                break;
        }
        return true;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressDialog.setMessage("current progress:"+values[0]+"%");
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        progressDialog.dismiss();
        if(result)
        {
            Toast.makeText(mainActivityContext, "success", Toast.LENGTH_SHORT).show();  
        }
        else
        {
            Toast.makeText(mainActivityContext, "fail", Toast.LENGTH_SHORT).show();  
        }
    }

    private int doDownload()
    {
        count+=1;
        return count;
    }

}

这就是问题所在。当我启动应用程序时,进度条会阻塞 UI 线程。 进度条完成后,Unity 启动。

当我将 OnCreate 中的 SimuDownloadTask 替换为以下代码时:

new Thread(){
@Override
public void run() {
    super.run();
    Looper.prepare();
    progressDialog=new ProgressDialog(UnityPlayerActivity.this,R.style.XMNewDialog);
    progressDialog.setTitle("test");
    progressDialog.setCancelable(true);
    progressDialog.show();
    Looper.loop();
}
}.start(); 

统一线程运行正常(没有被进度条阻塞)。所以我认为这个问题与Unity无关。

我已经查看了相关链接如: Asynctask from non ui thread 但仍然无法弄清楚问题所在。 任何线索都会有所帮助。

【问题讨论】:

    标签: java android multithreading unity3d android-asynctask


    【解决方案1】:

    您可以使用工作线程来处理计数器逻辑,并使用处理程序来更新进度条,而不是使用 AsyncTask。 请参阅此link 中的更新答案

    【讨论】:

    • 是的。知道为什么我的 AsyncTask 不能正常工作吗?
    • 真的不知道。按照我的逻辑,它应该有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多