SwipeRefreshLayout и AsyncHttpClient не работают сначала при создании

Я использую 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

Это единственная часть, которая выглядит необычной в моем журнале при запуске приложения.


person canigetabreak    schedule 04.05.2014    source источник
comment
Можете ли вы опубликовать свой MyRestClient класс? Похоже, он мог неправильно инициализироваться перед вызовом getGames в onCreate.   -  person myanimal    schedule 04.05.2014
comment
@myanimal Я разместил MyRestClient, это поможет вам решить проблему? Спасибо.   -  person canigetabreak    schedule 05.05.2014
comment
Вроде все понятно, ничего очевидного нет. Дважды проверьте свой каталог на наличие сообщений об ошибках и удалите все фильтры, которые могут быть применены. Иногда ошибки, происходящие вне процесса приложения, исключаются фильтрами по умолчанию.   -  person myanimal    schedule 05.05.2014
comment
@myanimal Добавлен некоторый вывод журнала, он странный, но не совсем связанный.   -  person canigetabreak    schedule 05.05.2014


Ответы (2)


Вы имеете в виду, что onCreate не вызывает getGames()? Вы пытались поместить getGames() в onResume()?

person Kamol Mavlonov    schedule 06.05.2014

После дальнейшего тестирования я заметил, что это происходит только на эмуляторе.

При запуске на реальном устройстве приложение отвечает ожидаемому. На данный момент я отношу это к проблеме, связанной с эмулятором, но буду обновлять эту тему, если появится что-то конкретное.

person canigetabreak    schedule 07.05.2014