0

私はアンドロイドが初めてです。半分にしてください。

これは非常に単純なシナリオです。アクションバーがあり、タブが選択されたら、http リクエストを送信して記事リストを取得する必要があります。応答が到着したら、リストビューを更新します。ここで例外が発生しました。

ネットワーク操作を UI スレッドから分離する必要があることを認識しているので、ネットワーク関数を AsyncTask クラスに実装します。

最も奇妙な部分は、記事のリストを取得しようとする前に、実際にネットワーク関数を 1 回呼び出してログインしたところ、例外なく正常に動作したことです! get article list 呼び出しを log in 呼び出しに置き換えても、問題なく動作します。引数が異なることを除いて、すべてのコードはまったく同じです。

ネットワークモジュールを使用するモジュールが多すぎるため、静的ラッパーを使用します。

UI -> Static Factory -> New AsyncTask -> 応答が到着 -> Static Factory で Static コールバック関数を呼び出す -> UI でコールバック関数を呼び出す

AsyncTask doInBackground

@Override
protected HttpResponse doInBackground(String... params) {
    // TODO Auto-generated method stub
    String uri = params[0];
    HttpGet get = new HttpGet(uri);
    try {
        return _client.execute(get);
    }
    catch(Exception e) {
        e.printStackTrace();
        return null;
    }   
}

AsyncTask ポスト実行

    @Override
    protected void onPostExecute(HttpResponse result) {
        //Do something with result
        if (result != null) {
            try {
                JSONObject json = FormJsonFromResponse();
                Command.OnTaskComplete(json);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

静的ラッパー コード:

@Override
    public static void OnTaskComplete(JSONObject json) {
        // TODO Auto-generated method stub
        if(_callback != null) {
            _callback.OnCommandComplete(json);
        }
    }

静的ラッパーで asynctask を呼び出す方法は次のとおりです。

public static void LogIn(String user, String pass) {
    new NetworkTask().execute(_uriPrefix + login, _user, _pass);
}
4

1 に答える 1

1

次のパターンに従って AsyncTask を修正します。

@Override
protected JSONObject doInBackground(String... params) {
    // TODO Auto-generated method stub
    String uri = params[0];
    HttpGet get = new HttpGet(uri);
    try {
        HttpResponse response = _client.execute(get);
        return FormJsonFromResponse();
    }
    catch(Exception e) {
        e.printStackTrace();
        return null;
    }   
}

AsyncTask ポスト実行

@Override
protected void onPostExecute(JSONObject result) {
    //Do something with result
    if (result != null) {
        try {
            Command.OnTaskComplete( result );
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
于 2012-12-27T00:54:54.537 に答える