2015-07-08 2 views
2

У меня есть приложение для Android, в котором есть много статей. Если вы открываете статью, создается новое действие. Теперь в работе есть часть, которая всегда одна и та же, но она отправляет запрос на сервер для получения данных. Я думал сделать фрагмент, который будет загружать данные только один раз (возможно, в MainActivity) и показывать его всем действиям. Возможно ли это и как мне это сделать?Загрузите фрагмент один раз и покажите его на других мероприятиях

Я также попытался создать фрагмент, но он по-прежнему загружает данные каждый раз, когда создается новое действие. Вот код XML.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#000000" /> 

    <!-- There is more layout, but I don't think it is needed for now --> 

</RelativeLayout> 

И Java

private class getMessage extends AsyncTask<Void , Void, Void>{ 

@Override 
protected Void doInBackground(Void... params) { 

    DefaultHttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httppost = new HttpGet("http:///www.example.com"); 
    HttpResponse response; 

    try {   
     response = httpclient.execute(httppost);   
     HttpEntity ht = response.getEntity(); 
     BufferedHttpEntity buf = new BufferedHttpEntity(ht);  
     InputStream is = buf.getContent(); 
     BufferedReader r = new BufferedReader(new InputStreamReader(is)); 
     total = new StringBuilder(); 
     String line; 
     while ((line = r.readLine()) != null) { 
      total.append(line + "\n"); 
     }   
    } 
    catch (ClientProtocolException e) {} 
    catch (IOException e) {} 

    return null; 

} 

@Override 
protected void onPostExecute(Void args){ 
    try{ 
     textView.setText(total.toString()); 
    } 
    catch(Exception e){} 
} 

} 

И код для добавления фрагмента

FragmentManager fragMan = getSupportFragmentManager(); 
android.support.v4.app.FragmentTransaction fragTransaction = fragMan.beginTransaction(); 
Fragment fragment = new Fragment(); 
fragTransaction.add(R.id.fragment_replace, fragment); 
fragTransaction.commit(); 
+0

При добавлении фрагмента к сделке, добавьте его с тегом, скажем, «MYTAG». Затем, когда вы создаете новое действие, выполните поиск этого фрагмента с помощью fragMan.findFragmentByTag («MYTAG»). И просто добавьте фрагмент к активности. Я не уверен, будет ли это работать или нет, но дайте ему шанс. –

+0

сделать все остальные действия дочерними элементами основной деятельности, расширив основную активность и получить значение вашей повторяющейся части через общую переменную в основной деятельности. –

+0

@ eric247. Я не думаю, что это возможно. Проверьте этот вопрос http://stackoverflow.com/questions/21319351/how-to-findfragmentbytag-that-is-created-in-another-activity – Enve

ответ

1

Фрагменты относятся только к одному виду деятельности. После вас commit() транзакция, этот фрагмент «принадлежит» этому действию.

Если вы хотите более высокий общий доступ уровня или данные, относящиеся к сети, я предлагаю вам реализовать его в Bound Service и есть деятельность или фрагменты, чтобы получить эти данные непосредственно из Service

0

Если у вас есть только один вид деятельности в приложении, это возможно. Но вы не можете показать загруженный фрагмент во многих действиях.

Только после добавления фрагмента в контейнер вы можете прикреплять и отделять фрагмент.

0

Вы пытаетесь кэширование данных с использованием фрагмента , но, как вы можете увидеть в документации:

Отрывок представляет собой поведение или часть пользовательского интерфейса в качестве деятельности

Источник: Fragments
Фрагмент должен быть использован, чтобы избежать «копировать-вставить» в коде пользовательского интерфейса.

Но вы пытаетесь использовать данные из сети. Это не mission с Фрагмент. Это не Tier, когда вы должны данные процесса. На Фрагмент вы должны загружать уже сохраненные данные.

Я могу предложить вам выбрать одно из следующих решений:
1). Используйте базу данных SQLite для кэширования данных.
Если вы хотите кэшировать данные в SQLite, я рекомендую вам использовать шаблон, который Вергилий Dobjanschi описано на конференции Google I/O в 2010 (ссылка на видео here)
Кроме того, я думаю, this примером может быть полезно для реализации этого шаблона.

2). Используйте несколько сетевых библиотек, которые могут помочь вам кэшировать данные

Robospice - это модульная андроида библиотека, которая позволяет писать асинхронные долго запущенные сервисы легко. Он специализируется на сетевых запросах, поддерживает кеширование и предлагает запросы REST из коробки с использованием модулей расширения.
ссылка: Robospice
Пример проекта: Robospice+Retrofit
Краткое описание как кэшировать:

getSpiceManager().execute(githubRequest, "github", DurationInMillis.ONE_MINUTE, new ListContributorRequestListener()); 

"github" - это ключ. DurationInMillis.ONE_MINUTE - время, пока данные в кеше будут актуальны. Это означает, что если вы впервые выполнили этот запрос, данные будут загружены из сети. Если вы выполнили этот запрос второй раз в течение 1 минуты, данные будут загружены из локального кеша.
Возможные значения DurationInMillis из docs:

**Field Summary** 

static long ALWAYS 
      Deprecated. 

static long ALWAYS_EXPIRED 
      Data in cache will never be returned, a network call will always be performed. 

static long ALWAYS_RETURNED 
      Data in cache will always be returned. 

static long NEVER 
      Deprecated. 

static long ONE_DAY 

static long ONE_HOUR 

static long ONE_MINUTE 

static long ONE_SECOND 

static long ONE_WEEK 

OkHttp - от docs:
OkHttp является клиентом HTTP, что это эффективный по умолчанию:

  • HTTP/2 и поддержка SPDY позволяет все запросы на тот же хост, чтобы разделить сокет.
  • Пул соединений уменьшает время ожидания запроса (если SPDY не
    ).
  • Прозрачный GZIP сжимает размеры для скачивания.
  • Кэширование отклика полностью исключает сеть для повторных запросов.

ссылка: OkHttp
Пример проекта: samples
Краткое описание как кэшировать:

// Create an HTTP client that uses a cache on the file system. Android applications should use 
    // their Context to get a cache directory. 
    OkHttpClient okHttpClient = new OkHttpClient(); 
    File cacheDir = new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString()); 
    HttpResponseCache cache = new HttpResponseCache(cacheDir, 1024); 
    okHttpClient.setResponseCache(cache); 

Полный примерhere

Смежные вопросы