2

私は asynctask を作成し、文字列データを取得しています:

View.OnClickListener btnClk = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (btnGetData.getId() == ((Button) v).getId()) {

            Object obj = new FetchTask(Main.this).execute((Integer) null);
        }
    }
};

私の仕事:

public class FetchTask extends AsyncTask<Object, Object, Object> {

    private Context ctx;
    private String xml;

    public FetchTask(Context context) {
        ctx = context;
    }

    @Override
    protected void onPreExecute() {
        DialogDownload_Ring = ProgressDialog.show(Main.this, "Download...",
                "Fetching XML data...");
        DialogDownload_Ring.setCancelable(true);
        DialogDownload_Ring.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                // TODO Auto-generated method stub
                cancel(true);
            }
        });
        super.onPreExecute();
    }

    @Override
    protected void onCancelled() {

        super.onCancelled();
    }

    @Override
    protected void onPostExecute(Object result) {

        if (result instanceof Exception) {
            DialogDownload_Ring.setMessage("Download failed!");

        } else {
            DialogDownload_Ring.setMessage("Succesfully Downloaded!");
        }
        DialogDownload_Ring.dismiss();
        super.onPostExecute(result);
    }

    @Override
    protected Object doInBackground(Object... params) {

        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(URL_Local);

            HttpResponse httpResponce = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponce.getEntity();
            xml = EntityUtils.toString(httpEntity);
            return xml;
        } catch (Exception e) {
            return e;
        }
    }
}

オブジェクトobjからxmlデータを取得するには? obj.toString() が機能していません。それ以外の場合は、asynctask 文字列プロパティを作成します (AsyncTask 文字列、文字列、文字列を拡張します) 動作していますが、xml データを取得した後にプログレスバーが開始されましたが、私も理解していません。お願い助けて。PS申し訳ありませんが、私の英語は苦手です..

4

2 に答える 2

3

実行完了後にメイン UI スレッドで結果を取得したい場合は、AsyncTask.get()doInBackgroundメソッドを呼び出して AsyncTask を実行する必要がありますが、これにより doInBackground の実行が完了するまで UI スレッドがフリーズします。UI のフリーズを回避するには、スレッド内で呼び出す必要があります。UI スレッドで結果を取得するために開始します。AsyncTask.get()AsyncTask

Object obj = new FetchTask(Main.this).execute((Integer) null).get();

2 番目の方法は、メソッドを呼び出さずに AsyncTask を開始し、実行が完了したときAsyncTask.getにメソッドで結果を受け取ることです。ボタンのクリックで AsyncTask を開始します。onPostExecutedoInBackground

new FetchTask(Main.this).execute((Integer) null);

次のように結果を取得しonPostExecuteます。

 @Override
    protected void onPostExecute(Object result) {

           // extract xml from result 

        super.onPostExecute(result);
    }
于 2013-02-11T06:39:23.510 に答える
0

ASyncTask は次のようには機能しません。

Object obj = new FetchTask(Main.this).execute((Integer) null);

execute メソッドはすぐに戻り、タスクはバックグラウンドで続行されます。

ASyncTask は非同期であるため、onPostExecute終了時に何かを行うメソッドがあります。onPostExecuteダイアログを閉じる前または後に、返された項目 (xml) を処理するコードを挿入します。

于 2013-02-11T06:37:48.253 に答える