0

このAsyncTaskを使用してSkypeページhttps://login.skype.com/json/validator?new_username=usernameを呼び出し、特定のSkype連絡先がすでに存在するかどうかを理解しています。

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);

}
}

主なアクティビティは、Skype検証ユーザーの結果を取得するためにこのタスクを呼び出します。コードは次のとおりです。

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

        }

私の問題は次のとおりです。

  1. statusメインアクティビティでタスクの結果(文字列)を取得する必要があります。

  2. 呼び出し後、task.executeメインアクティビティの次のコードは、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がメインアクティビティの内部クラスである場合は、メインアクティビティの関数を呼び出して、それを渡すことができます。result

そうではないように見えるので、でコンストラクターを作成し、AsyncそれContextをメインアクティビティから渡して、変数をメインアクティビティに戻すことができます。

また、の目的は、スレッドAyncTaskをブロックしないことですUI。ロジックを、AsyncTaskが呼び出す別の関数に配置します。

于 2013-02-06T16:38:08.797 に答える
0

AsyncTaskから結果を取得するのは簡単です。。。Googleドキュメントだけでは、その方法が明確にされていません。これが簡単な要約です。

task.execute(params);

AsyncTaskを開始し、doInBackground含めるパラメーターが何であれ、メソッドに渡します。終了するとdoInBackground、関数の結果をに渡しonPostExecuteます。onPostExecuteそれはあなたがそれを送ったものは何でも返すことができるだろうと思うでしょう。そうではありません。doInBackgroundに送信されたの結果を取得するには、onPostExecuteを呼び出す必要があります

task.get();

この.get()メソッドは、タスクの実行が完了するまで自動的に待機し、結果がonPostExecuteUIスレッドに戻った場合はそれを返します。結果を任意の変数に割り当てて、その後は通常どおりに使用できます。たとえば、

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

OnPostExcute メソッドは、UI/メインスレッドで呼び出されます。結果の分析を続けるには、ロジックをそこに移動する必要があります。

于 2013-02-06T16:36:03.590 に答える
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 に答える