6

サーバー側からデータを取得するために AsyncTask を作成しようとしていました。ただし、「IOUtils.copy((response_.getEntity().getContent()), writer);」行の onPostExecute() で Null ポインター例外が報告されます。いくつかのログを使用して何が起こるかを確認したところ、ログ 1 と 3 は印刷されていましたが、ログ 2 は印刷されていませんでした。client.executed() が終了する前に onPostExecute が実行されたのはなぜですか? 誰でもいくつかの提案をすることができますか?

private class GetForm extends AsyncTask<String, Integer, Object> {
    private HttpResponse response_;
    private Exception exception_;
    private String url_;

    public GetForm(String url) {
        super();
        url_ = url;
    }
    protected Object doInBackground(String... params) {
        try {
            Log.i("mylog","inside doInbackground 1.");
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(url_);
            response_ = client.execute(request);
                            Log.i("mylog","inside doInbackground 2.");

        } catch (Exception e) {
            exception_ = e;
        }
        return response_;
    }
    @Override
    protected void onPostExecute(Object o) {
        // Your current UI stuff here.
        Log.i("mylog","inside onPostExecute 3.");
        StringWriter writer = new StringWriter();
        try{
            IOUtils.copy((response_.getEntity().getContent()), writer);
        ......

        }catch(IOException e) {
            e.printStackTrace();
        }
    }
}
4

2 に答える 2

5

onPostExecute() が最初に呼び出された可能性は低く、doInBackground().. で例外がスローされた可能性が高く、ログ 2 が出力されなかった理由も同様です。LogCat の警告ページまたはデバッグ ページを確認します。また、両方の例外を別々に出力する必要があります。

于 2012-10-13T04:02:17.630 に答える
1

onPostExecute()終了する前に実行することはできませんdoInBackground()

doInBackground()何を呼び出しても非同期スレッド/タスクでのみ実行されることを知っておく必要があります。onPostExecute()メイン UI スレッド自体で実行されます。

コードでこのタスクをどのように呼び出したかを示します。

そして、チェックしなければならない主なことは、それが完了していることを確認しない限りAsyncTask、メインからフェッチされたデータを使用してはならないということです。UIThreadAsynctask

終了前に実行される可能性があるためAsyncTask、間違いなくNULLExceptionそのシナリオに参加します。

于 2012-10-13T07:14:28.413 に答える