私はアンドロイドが初めてです。半分にしてください。
これは非常に単純なシナリオです。アクションバーがあり、タブが選択されたら、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);
}