2017-02-07 15 views
0

少し背景: 'onResume'が私のサーバーに接続して情報を要求するときの私の主なアクティビティ。これは正しく動作します。 アクティビティが応答を受け取ると、配列にデータをロードします。配列のロードが完了すると、メインアクティビティにある 'UpdateFragments'が呼び出されます。 ここでは、今私はただ一つの断片を使用するために、これは私のアダプタである...すべてのフラグメントがupdateView()プロシージャを実装して...非同期タスクのフラグメントを更新する

public void updateFragments() { 
    List<Fragment> allFragments = getSupportFragmentManager().getFragments(); 
    if (allFragments == null || allFragments.isEmpty()) 
     return; 
    for (Fragment fragment : allFragments) 
     if (fragment.isVisible()) 
      ((UpdatableFragment) fragment).updateView(); 
} 

です:

おかしくへ
public class MainAdapter extends FragmentPagerAdapter { 

    MainAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return FragmentDevices.newInstance(); 
    } 

    @Override 
    public int getCount() { 
     return 1; 
    } 
} 

そして今、次のコードで一部...(私たちは今、断片である)それだけで動作しますが、実行しているときに私は、文字列と私の空白の断片があります。私は私のupdateView上で同じコードを入れた場合(

private TextView tv; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.device_fragment, parent, false); 
    tv = (TextView) view.findViewById(R.id.room); 
    tv.setText("PRINT THIS"); 
    return view; 
} 

を)

@Override 
public void updateView() { 
    tv.setText("PRINT THIS"); 
} 

しかし...と、ここでそれがあるべきよう非同期タスクが終了したときにupdateViewがMainActivityから呼び出された場合、我々は大きな毛深いしかし...を持っている:onCreateViewそれはまた働く内側に手続きして呼び出します...テキストは決して印刷されません。 そして奇妙なことはちょうど始めに...コードをデバッグしようとすると..私はtv.setText命令に達すると、アプリはちょうど死ぬ...エラーなし。

02-07 16:48:18.015 1649-3024/? I/ActivityManager: Force stopping XXX appid=10185 user=0: from pid 23193 
02-07 16:48:18.015 1649-3024/? I/ActivityManager: Killing 22729:XXX/u0a185 (adj 0): stop XXX 
02-07 16:48:18.027 1649-3440/? I/WindowState: WIN DEATH: Window{8db1796 u0 XXX/XXX.MainActivity} 

編集: @nbokmansは右のだろうか?

@Override 
public void onStart() { 
    super.onStart(); 
    mDataManager = new DataManager(this); 
} 

とのDataManagerクラスは、このです::それはMainActivityにある コンストラクタ:

public DataManager(MainActivity context) { 
    super(context); 
    mHandle = context; 
    ... 
} 

非同期タスクはこれを呼び出します。

public void onNewData(JSONObject data) { 
    ... 
    mHandle.updateFragments(); 
} 
+1

これはあなたの問題の原因ですが、あなたはまだあなたが 'updateFragments'メソッドを呼び出しているthread.How非UIから' updateView'メソッドを呼び出すことができればわかりませんか?それをあなたの投稿に追加できますか? – nbokmans

+0

自分のビューを更新するためにフラグメントitslefのメソッドを使用しました。アクティビティは、あなたが望むフラグメントを添付する必要があります。 – rlopezo

+0

datamanagerはバックグラウンドスレッドを使用していますか? – Krish

答えて

1

UIスレッドからmHandle.updateFragments()を呼び出す必要があります。すでにデータマネージャーのコンストラクタにMainActivityインスタンスを渡すので、あなたは単にUIスレッド上でコードを実行するには、この操作を行うことができます。

public void onNewData(JSONObject data) { 
    mHandle.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      mHandle.updateFragments(); 
     } 
    } 
} 

編集:あなたはまた、実際にupdateFragmentsコードをラップするために選択することができますrunOnUiThreadブロック:

public void updateFragments() { 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      List<Fragment> allFragments = getSupportFragmentManager().getFragments(); 
      if (allFragments == null || allFragments.isEmpty()) 
       return; 
      for (Fragment fragment : allFragments) { 
       if (fragment.isVisible()) 
        ((UpdatableFragment) fragment).updateView(); 
      } 
     } 
    }); 
} 
+0

作業中...ありがとうございます! – nullpointer17

-1

のようなフラグメントのコード内でメソッドを作成してみてください前の1つ:

@Override 
public void updateView() { 
    tv.setText("PRINT THIS"); 
} 

そして、このようなものでAsyncTaskのあなたの "onPostExecute" からそれを呼び出す:

protected void onPostExecute() { 
    //Example of some fragment 
    Yourfragment frag = ((Yourfragment) getSupportFragmentManager().findFragmentByTag("Yourfragment")); 
    ((Yourfragment)frag).updateView(); 
} 

それをお試しください!

+0

'onPostExecute'のコードは間違いなく動作しません。どこにも添付されていないフラグメントの新しいインスタンスを作成しています。 – nbokmans

+0

これは一例で、すでに編集されている場合は「編集」を使用します –

+0

今すぐどうぞ? @nbokmans –