54

私は次のクラスを持っています:

public class getURLData extends AsyncTask<String, Integer, String>{

@Override
protected String doInBackground(String... params) {
    String line;
    try {  
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(params[0]);

        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        line = EntityUtils.toString(httpEntity);

    } catch (UnsupportedEncodingException e) {
        line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
    } catch (MalformedURLException e) {
        line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
    } catch (IOException e) {
        line = "<results status=\"error\"><msg>Can't connect to server</msg></results>";
    }
    return line;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
}

}

そして、私はそれをこのように呼ぼうとしています:

String output = null;
output = new getURLData().execute("http://www.domain.com/call.php?locationSearched=" + locationSearched);

しかし、出力変数はデータを取得していません。代わりに、エラーが発生しています。

Type mismatch: cannot convert from AsyncTask<String,Integer,String> to String
4

8 に答える 8

113

メソッドはそれ自体をexecute返します。AynscTask呼び出す必要がありますget

output =
    new getURLData()
        .execute("http://www.example.com/call.php?locationSearched=" + locationSearched)
        .get();

これにより、新しいスレッドからの作業が終了して結果が返されるまで、execute現在のスレッド(via)をブロックしながら(via)新しいスレッドが開始されます。get

これを行うと、非同期タスクが同期タスクに変わります。

ただし、使用の問題getは、ブロックされるため、ワーカースレッドで呼び出す必要があることです。ただし、AsyncTask.execute()メインスレッドで呼び出す必要があります。したがって、このコードは機能する可能性がありますが、望ましくない結果が生じる可能性があります。またget()、それはグーグルによって十分にテストされていないのではないかと思います。そして、彼らがどこかにバグを導入した可能性があります。

参照:AsyncTask.get

于 2012-06-10T20:30:42.530 に答える
18

UIスレッドをブロックするよりもコールバックを作成したいです。クラスでは、データが到着したときに呼び出されるメソッドを作成します。例えば:

private void setData(String data){
    mTextView.setText(data);
}

次に、AsyncTaskでonPostExecuteを実装します。

@Override
protected void onPostExecute(String result) {
    setData(result);
}

そして、コードのどこかでタスクを実行します。

new getURLData().execute(...

タスクが終了すると、setDataが呼び出され、mTextViewがいっぱいになります。

AsyncTask.get()はUIを壊してしまうため、AsyncTaskを使用する理由はありません。

于 2012-06-10T20:45:39.353 に答える
4

ユーザーがボタンをクリックした後、コンテンツを待つ必要がある場合、その間に何をしますか?

なぜこれをしないのですか?

  1. ユーザーがボタンをクリックします。
  2. 接続を確認します。ユーザーがインターネットに接続していない場合は、そのことを伝えます。
  3. IntentServiceを開始するには、HTTPリクエストを送信するためのインテントを送信します。
  4. リクエストが終了したら、通知を投稿します。
  5. ユーザーが通知をクリックすると、次のステップを実行できるアクティビティに戻ります。

これにより、ユーザーはリクエストの処理中に何でもすることができます。

IntentServiceは、独自のスレッドでバックグラウンドで実行されます。インテントを受信すると、onHandleIntent()を実行します。そのメソッドが終了すると、サービスはキャッシュされます。サービスはアクティブではありませんが、次のインテントが到着したときにすぐに再開できます。

于 2012-06-10T21:13:25.560 に答える
2
  1. 次のようにコンストラクターでコンテキストを取得します。

    public GetDataTask(Context context) {}

  2. 次の方法でインターフェースを作成します。

    void onDataRetrieved(String data);

  3. Taskオブジェクトを作成しているクラスにインターフェイスを実装します(例MainActivity

  4. コンテキストをインターフェースにキャストし、onDataRetrievedメソッドを呼び出します

于 2016-09-03T19:40:56.110 に答える
0

次のコードでは、AsyncTaskから文字列(directorName)を取得します。

public class GetDirector {
    String id;
    private String baseURL = "http://www.omdbapi.com/?i=";
    private String finalURL = "";
    String theDirector;

    public GetDirector(String imdbID) throws ExecutionException, InterruptedException {
        id= imdbID;
        finalURL = baseURL + id + "&plot=full&r=json";
        System.out.println("GetDirector. finalURL= " + finalURL);
        theDirector = new GetDirectorInfo().execute().get();
    }

    public String getDirector (){
        return theDirector;
    }

    private class GetDirectorInfo extends AsyncTask<Void, Void,String> {
        @Override
        protected String doInBackground(Void... params) {
            String directorName = null;

            ServiceHandler sh = new ServiceHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(finalURL, ServiceHandler.GET);
            System.out.println("Act_DetailsPage. jsonStr= " + jsonStr);

            if (jsonStr != null) {
                try {
                    JSONObject everything = new JSONObject(jsonStr);

                    directorName = everything.getString(JSON_Tags.TAG_DIRECTOR);
                    System.out.println("directorName= "+ directorName);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println("Inside GetDirector. Couldn't get any data from the url");
            }
            return directorName;
        }
    }
}
于 2015-10-17T04:23:11.747 に答える
0

結果のデータを格納するオブジェクトを参照するコンテキストパラメーターをタスクのコンストラクターに追加します。

class PopulateArray extends AsyncTask<Integer, Integer, ArrayList<String>>
{
    Context _context; // context may be what ever activity or object you want to store result in
    PopulateArray(Context context)
    {
        _context = context;
    }
    @Override
    protected ArrayList<String> doInBackground(Integer... integers)
    {
        ArrayList<String> data = new ArrayList<String>();
        //manipulate
        return data;
    }

    @Override
    protected void onPostExecute(ArrayList<String> strings)
    {
        _context.setData(strings);
    }
}
于 2016-07-22T08:36:39.253 に答える
0

このワンライナーは私のために働いた:

String result = MyasyncTask.execute(type, usrPhoneA, usrPWDA).get();
于 2017-09-24T02:53:14.717 に答える
0

AsyncTask苦痛を伴わずにUIにデータを送信する唯一の方法は、オットーまたはイベントバスです。UIの@Subscribeアノテーションの下で結果を処理し、のメソッドで結果を処理するメソッドを登録します。postmessageonPostExecuteAsyncTask

于 2017-12-01T04:40:36.510 に答える