繁体   English   中英

Android AsyncTask等到完成

[英]Android AsyncTask wait until finished

我正在Android应用程序中使用AsyncTask调用Web服务,但我不知道如何等待onPostExecute完成:

//Call Async Web Service here 
AsyncCallWS task = new AsyncCallWS();
task.execute();
//Need to wait to fill this in ** Its not  waiting.
String sCall = rslt;
String[] aCall = sCall.split("//|");

private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        Log.i(TAG, "onPreExecute");
    }
    @Override
    protected Void doInBackground(Void... params) {
        Log.i(TAG, "doInBackground");
        GetURL();
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        Log.i(TAG, "onPostExecute");
        try{
            //Results HERE
            rslt = resultString.toString();
        }
        catch(Exception ex)
        {rslt = ex.toString()+ "|" + ex.toString();}

    }
}

我不清楚您是否可以/不想从onPostExecute进行操作,但是如果您想执行与任务无关的操作,则可以使用回调(以便您可以在任何地方运行任务)

private class OnFinishedListener {
    void onFinished(String rslt);
}

private class AsyncCallWS extends AsyncTask<Void, Void, Void> {

    private OnFinishedListener mAfter;

    public AsyncCallWS(OnFinishedListener after) {
        mAfter = after;
    }

    ...

    @Override
    protected void onPostExecute(Void result) {
        ....
        if (mAfter != null) {
            //you didnt illustrate what resultString is, you might
            //want this to be the returned value from doInBackground
            mAfter.onFinished(resultString.toString());
        }
    }

}

用法

new AsyncCallWS(new OnFinishedListener {
    public void onFinished(String rslt) {
        //for example
        String sCall = rslt;
        String[] aCall = sCall.split("//|");
    }
}).execute();

您可以在后台线程中使用Tasks.await(task) 不要在UI线程中使用它。 您还可以为任务Tasks.await(task, 500, TimeUnit.MILLISECONDS);设置超时Tasks.await(task, 500, TimeUnit.MILLISECONDS);

使用getStatus()方法。

while (task.getStatus() != Status.FINISHED);

更好的方法是在onPostExecute()方法内调用split() ,因为onPostExecute()无论如何都在UI线程上运行, while()调用将阻止当前正在运行的线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM