Я использую SwipeRefreshLayout для удаленного извлечения данных, которые я использую AsyncHttpClient, чтобы заботиться о сетевой стороне вещей.
Все работает как положено, за исключением одного сценария: первый запуск приложения onCreate.
Основной вид деятельности:
public class MainActivity extends Activity implements AdapterView.OnItemClickListener, SwipeRefreshLayout.OnRefreshListener{
ListView mainListView;
JSONMainAdapter mJSONAdapter;
SwipeRefreshLayout swipeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
swipeLayout = (SwipeRefreshLayout) findViewById(R.id.main_swipe_container);
swipeLayout.setOnRefreshListener(this);
swipeLayout.setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
mainListView = (ListView) findViewById(R.id.main_listview);
mainListView.setOnItemClickListener(this);
mJSONAdapter = new JSONMainAdapter(this, getLayoutInflater());
mainListView.setAdapter(mJSONAdapter);
getGames();
}
При обновлении:
@Override
public void onRefresh() {
getGames();
}
GetGames, которая поднимает сеть:
private void getGames() {
swipeLayout.setRefreshing(true);
//gets logged on first onCreate load
Log.d("DEBUG", "IN GET GAMES");
MyRestClient.get("games", null, new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONObject jsonObject) {
//does NOT get logged on first onCreate
//but does get logged on refresh and other onCreate calls
Log.d("DEBUG", "IN GET GAMES ON SUCCESS");
swipeLayout.setRefreshing(false);
Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();
mJSONAdapter.updateData(jsonObject.optJSONArray("games"));
}
@Override
public void onFailure(int statusCode, Throwable throwable, JSONObject error) {
Log.d("DEBUG", "IN GET GAMES ON FAIL");
swipeLayout.setRefreshing(false);
Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show();
Log.e("ERROR", statusCode + " " + throwable.getMessage());
}
});
}
Поэтому, когда я запускаю приложение из своей IDE, onCreate
вызывает функцию getGames()
и регистрирует, что она туда попала, но сеть MyRestClient.get("games", null, new JsonHttpResponseHandler() {
не вызывается, поскольку она не извлекает данные и никогда не регистрируется при успехе или отказе.
Прямо сейчас, если я прокручиваю, чтобы обновить, он работает и успешно заполняет мой список извлеченными данными и журналами, которые он был в onSuccess.
Если я закрываю приложение с помощью кнопки «Назад» и снова открываю, оно работает правильно и обновляет мой список.
Таким образом, он не работает только при первом вызове onCreate при запуске из моей IDE в эмулятор, но после этого первого начального onCreate не работает, все работает правильно.
Я не уверен, что мне здесь не хватает, любая помощь приветствуется, спасибо.
SwipeRefreshLayout: https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html
AsyncHttpClient: http://loopj.com/android-async-http/
ИЗМЕНИТЬ:
public class MyRestClient {
private static final String BASE_URL = "http://10.10.1.10:3000/api/";
private static AsyncHttpClient client = new AsyncHttpClient();
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
addAuthHeaders();
client.get(getAbsoluteUrl(url), params, responseHandler);
}
public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
addAuthHeaders();
client.post(getAbsoluteUrl(url), params, responseHandler);
}
private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeUrl;
}
public static void addAuthHeaders(){
client.addHeader("blah", "xxx");
client.addHeader("blah", "xxx");
}
}
РЕДАКТИРОВАТЬ 2:
> 05-05 08:51:20.477: E/memtrack(1696): Couldn't load memtrack module
> (No such file or directory) 05-05 08:51:20.477:
> E/android.os.Debug(1696): failed to load memtrack module: -2 05-05
> 08:51:20.857: D/AndroidRuntime(1696): Calling main entry
> com.android.commands.am.Am 05-05 08:51:20.937: I/ActivityManager(380):
> START u0 {act=android.intent.action.MAIN
> cat=[android.intent.category.LAUNCHER] flg=0x10000000
> cmp=com.example.myapp.app/.MainActivity} from pid 1696 05-05
> 08:51:21.047: D/gralloc(49): Registering a buffer in the process that
> created it. This may cause memory ordering problems. 05-05
> 08:51:21.047: E/libEGL(49): called unimplemented OpenGL ES API 05-05
> 08:51:21.057: E/libEGL(49): called unimplemented OpenGL ES API 05-05
> 08:51:21.057: E/libEGL(49): called unimplemented OpenGL ES API 05-05
> 08:51:21.057: E/libEGL(49): called unimplemented OpenGL ES API 05-05
> 08:51:21.057: E/SurfaceFlinger(49): glCheckFramebufferStatusOES error
> 1620973071 05-05 08:51:21.057: E/SurfaceFlinger(49): got
> GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot 05-05
> 08:51:21.057: E/libEGL(49): called unimplemented OpenGL ES API 05-05
> 08:51:21.057: E/libEGL(49): called unimplemented OpenGL ES API 05-05
> 08:51:21.067: W/WindowManager(380): Screenshot failure taking
> screenshot for (328x546) to layer 21005
Это единственная часть, которая выглядит необычной в моем журнале при запуске приложения.
MyRestClient
класс? Похоже, он мог неправильно инициализироваться перед вызовомgetGames
вonCreate
. - person myanimal   schedule 04.05.2014