2016-08-14 5 views
1

Я в основном получаю значение, обновляемое внутри AsyncTask, и я использую onPostExecute, чтобы отправить его фрагментам. Все фрагменты должны отображать одинаковое значение на TextView.Как обновить все фрагменты? onProgressUpdate Не обновляет все фрагменты

Моя проблема заключается в том, что мое приложение имеет 3 страницы фрагмента и только средняя страница (Fragment_B) обновляет ...

(Если изменить Fragment_B к Fragment_A (в строке кода ниже), только Fragment_A будет обновляться).

public Fragment getItem(int position) { 
     switch (position) 
     { 
      case 0: 
       return new Fragmento_B(); 
      case 1: 
       return new Fragmento_A(); //now only Fragment_A updates 
      case 2: 
       return new Fragmento_C(); 
      default: 
       return null; 
     } 

    } 

Почему все фрагменты не обновляются одновременно? Значение никогда не отображается на Fragment_A и Fragment_C.

OnPostUpdate должен обновить все фрагменты, но он обновляет только Fragment_B. Но я попытался отладить эту проблему, и я создал onPreUpdate и I SetText, и он работает для каждого фрагмента. Я понятия не имею, почему это происходит. Может кто-нибудь мне помочь?

public class Cliente extends AsyncTask<Void, Void, Void> { 

String dstAddress; 
int dstPort; 
String[] valores = new String[2]; 
TextView textResponse,textResponse2; 

public Cliente(String addr, int port, TextView textResponse) { 
    dstAddress = addr; 
    dstPort = port; 
    this.textResponse = textResponse; 
    // this.textResponse2 = textResponse2; 

} 

public Cliente(TextView textResponse) { 
    this.textResponse = textResponse; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    textResponse.setText("HELLO"); 
} 

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


     Socket socket = null; 

     try { 
      socket = new Socket(dstAddress, dstPort); 

      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
        1024); 
      byte[] buffer = new byte[1024]; 

      int bytesRead; 
      Scanner r = new Scanner(new InputStreamReader(socket.getInputStream())); 

    /* 
     * notice: inputStream.read() will block if no data return 
     */ 
      valores[0] = r.nextLine(); 

     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } finally { 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 

    return null; 

} 


@Override 
protected void onPostExecute(Void result) { 
    super.onPostExecute(result); 
    textResponse.setText(":D"); 
} 

Фрагмент A:

 public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.activity_second,container,false); 


    x_atual = (TextView) v.findViewById(R.id.x_atual); 
    y_atual = (TextView) v.findViewById(R.id.y_atual); 
    x_desejado = (TextView) v.findViewById(R.id.x_desej); 
    y_desejado = (TextView) v.findViewById(R.id.y_desej); 
    ola = (TextView) v.findViewById(R.id.textView12); 

    new Cliente("192.168.2.5",6000,ola).execute(); 


    return v; 
} 

Фрагмент B:

public class Fragmento_B extends android.support.v4.app.Fragment{ 

public TextView x_atual,y_atual,x_desejado,y_desejado,ola2,ola; 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.activity_third,container,false); 

    ola2 = (TextView) v.findViewById(R.id.textView2); 

    new Cliente("192.168.2.5",6000,ola2).execute(); 

    return v; 
} 

В основном onPostUpdate только делает ": D" появляется на fragment_B и onPreUpdate хорошо работает, и появляется сообщение "Hello" на обоих ,

FRAGMENTADAPTER АКТИВНОСТЬ

public class Main2Activity extends FragmentActivity { 

private TabLayout mTabLayout; 
private ViewPager mViewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 

    mTabLayout = (TabLayout) findViewById(R.id.tab_layout); 
    mViewPager = (ViewPager) findViewById(R.id.view_pager); 

    mViewPager.setAdapter(new FragmentoAdapter(getSupportFragmentManager(),getResources().getStringArray(R.array.tiles_tab))); 

    mTabLayout.setupWithViewPager(mViewPager); 

} 

FRAGMENTADAPTER КЛАСС

public class FragmentoAdapter extends FragmentPagerAdapter { 

    private String[] mTabTiles; 

    public FragmentoAdapter(FragmentManager fm,String[] mTabTiles) { 
     super(fm); 
     this.mTabTiles = mTabTiles; 
    } 



    @Override 
    public Fragment getItem(int position) { 
     switch (position) 
     { 
      case 0: 
       return new Fragmento_A(); 
      case 1: 
       return new Fragmento_B(); 
      case 2: 
       return new Fragmento_C(); 
      default: 
       return null; 
     } 

    } 


    @Override 
    public int getCount() { 
     return this.mTabTiles.length; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return this.mTabTiles[position]; 
    } 
} 

MY APPLICATION

ответ

0

Почему вы делаете ту же логику в отдельном фрагменте? Вы должны создать DataManager, которые извлекают и сохраняют данные (подробнее о шаблоне MVP/MVC). Также вы не должны передавать представление как arg. Если вы хотите использовать Asynctask, используйте его в Activity как внутренний класс, а затем получите это поле TextView и установите его в onPostExecute()

+0

Можете ли вы сделать это немного проще? Я только начал программировать в Android. Это не простая проблема? Почему он только обновляет второй фрагмент? –

+0

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

+0

@TiagoSilva Вы отлаживали его? –