0

I'm using this AsyncTask for calling the skype page https://login.skype.com/json/validator?new_username=username for understand if a certain skype contact already exsists.

public class SkypeValidateUserTask extends AsyncTask<String, Void, String>{

protected String doInBackground(String...urls){
    String response = "";
    for(String url:urls){
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        try{
            HttpResponse execute = client.execute(httpGet);
            InputStream content = execute.getEntity().getContent();

            BufferedReader buffer = new BufferedReader(new InputStreamReader(content));

            String s="";
            while((s=buffer.readLine()) != null){
                response+=s;
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    return response;
}

public void onPostExecute(String result){
    String status="";
    try{    
        JSONObject obj=new JSONObject(result);
        status=obj.getString("status");
    }catch(Exception ex){
        ex.printStackTrace();
    }
    //Log.i("RISULTATO: ","STATO: "+status);

}
}

The main activity call this task for getting skype validation user result. The code is:

String skype = "name.surname.example";  

if(!skype.equalsIgnoreCase("")){
            // check if the skype contact exists
            SkypeValidateUserTask task = new SkypeValidateUserTask();
            task.execute(new String[] {"https://login.skype.com/json/validator?new_username="+skype});  

                // here I need to obtain the result of the thread

        }

My problems are:

  1. I need to get the result of the task (the String status) in the main activity.

  2. After the task.execute call, the next code in main activity is executed without wait for result returned from asynctask.

4

7 回答 7

2

使用 get() 方法从异步任务中获取结果是危险的,因为它阻塞了 UI 线程。使用这个线程,我提供了一个可重用的解决方案回调机制来从异步线程获取结果而不阻塞 UI 线程

我在lapslaz的帮助下实现了这一点

public JsonData(YourActivityClass activity) 
{
    this.activity=activity;
    mProgressDialog = new ProgressDialog(activity);

}
protected void onPostExecute(String jsondata) {
    if (mProgressDialog != null || mProgressDialog.isShowing()){
        mProgressDialog.dismiss();
    }
    if(jsondata!=null) {
        activity.yourcallback(jsondata)
    }

}

And define the yourcallback() in YourActivityClass

private void yourcallback(String data) {
    jsonRecordsData=data;
    showRecordsFromJson();

}
于 2013-02-06T18:34:42.847 回答
1

在主线程上启动您的 AsyncTask。在 AsyncTask 的preExecute方法中,您可以启动 ProgressDialog 以向用户指示您正在执行的操作需要几秒钟。使用doInBackground执行长时间运行的任务(在您的情况下检查有效的 Skype 用户名)。完成后,将调用onPostExecute 。由于这在 UI 线程上运行,因此您可以处理结果并根据它执行进一步的操作。不要忘记在 onPostExecute 中关闭 ProgressDialog。

于 2013-02-06T16:41:11.320 回答
0

从 AsyncTask 中获取结果很容易。. . 只是谷歌文档没有明确说明如何做到这一点。这是一个快速运行。

task.execute(params);

将启动 AsyncTask 并将doInBackground您包含的任何参数传递给该方法。doInBackground完成后,它将其函数的结果传递onPostExecute给. 有人会认为这onPostExecute将能够退回您发送的任何内容。它没有。要获得doInBackground发送给onPostExecute您的结果,需要调用

task.get();

.get()方法会自动等待任务完成执行,然后将返回的任何结果onPostExecute返回给 UI 线程。您可以将结果分配给您想要的任何变量并在此之后正常使用 - 例如

JSONObject skypeStuff = task.get()

换句话说 - 就像 AsynTask 不会自行启动一样,它也不会自行返回。与您需要从 UI 线程相同的方式.execute(),您需要从 UI 线程调用.get()以提取任务的结果。

于 2013-02-06T17:15:14.033 回答
0

这就是为什么 asyncTask 在这里。您不能在 UI 线程中进行阻塞函数调用,因为这会使您的应用程序无响应。

于 2013-02-06T16:35:55.323 回答
0

在UI/主线程上调用OnPostExcute 方法。您需要将逻辑移到那里以继续分析结果。

于 2013-02-06T16:36:03.590 回答
0

如果您AsyncTask是主要活动的内部类,那么您可以在主要活动中调用一个函数并将其传递给result

由于它看起来不是,您可以在您的构造函数中创建构造函数Async并将其Context从您的主要活动传递给您,这样您就可以将变量传递回主要活动

此外,目的AyncTask是不阻塞您的线程,将您的逻辑放在将调用UI的单独函数中AsyncTask

于 2013-02-06T16:38:08.797 回答
0

您需要在 AsyncTask 中实现回调机制。所以代替这个:

task.execute(...);
// use results of task

你的结构应该是:

    task.execute(...);
    // go do something else while task has a chance to execute

public void statusAvailable(String status) {
    // use results of task
}

并在onPostExecute

public void onPostExecute(String result) {
    . . .
    status=obj.getString("status");
    activity.statusAvailable(status);
}
于 2013-02-06T16:38:39.697 回答