1

1秒ごとにフラグメント(一部のテキストリスト)を更新するスレッドをAndroidに実装しました。

スレッドでフラグメントメソッドを呼び出しているときにランタイムエラーが発生します。これが私のコードです

public class RunThreadExtended extends Activity implements Runnable
{
public void run() {

 while(true)
 {  try {
    Thread.sleep(1000);
    AndroidListFragmentActivity.strup++;
    MyListFragment1 fragmentB = (MyListFragment1)getFragmentManager().findFragmentById(R.id.fragment1);
    fragmentB.updatefrag();
} catch (InterruptedException e) {
    e.printStackTrace();
}
  }}}

Mainactivityからfragmentメソッドを呼び出すと、すべてが機能します。これは、このように実装したバックグラウンドで5秒ごとにスレッドを更新する必要があるためですが、機能しない..plsは解決策を提案します...

4

5 に答える 5

5

さわやかにする必要があると思います

yourActivity.runOnUiThread(new Runnable() {
public void run()   { /* here */ });

または を介し​​てHandler、または を介し​​て または をpost()介しAsyncTask​​てonProgress()

于 2012-07-12T17:05:42.773 に答える
1

UI 以外のスレッドで UI 操作を行っているため、エラーが発生しています。コードを次のように変更すると、そのエラーは発生しなくなります。

public class RunThreadExtended extends Activity implements Runnable
{
   public void run() {

   while(true)
   {  try {
       Thread.sleep(1000);
       AndroidListFragmentActivity.strup++;
       RunThreadExtended.this.runOnUiThread(new Runnable() { //Use the runOnUIThread method to do your UI hanlding in the UI Thread
           public void run()   {
               MyListFragment1 fragmentB = (MyListFragment1)getFragmentManager().findFragmentById(R.id.fragment1);
               fragmentB.updatefrag();
           }
       });
   } catch (InterruptedException e) {
        e.printStackTrace();
   }
   }}}
于 2012-07-12T17:07:50.717 に答える
0

スレッドでインテント (context.sendBroadcast(intent)) をブロードキャストし、アクティビティで受信することもできます: Broadcast Receiver

于 2012-10-03T23:21:52.990 に答える
0

UI スレッド以外のスレッドで UI を更新することはできません。スレッドを更新する場合は、毎秒メッセージを送信するハンドラーを使用できます (ハンドラーはメイン UI スレッドですべてのメッセージを処理します)。

見る

スレッドから UI を更新する

于 2012-07-12T17:08:15.143 に答える
0

maybe you can do all the work inside a fragment. here are the steps.

  1. define the Handler and Runnable in the fragment.
  2. create the Handler and Runnable in the onCreate() and onAttach()
  3. post the Runnable job in the Handler in onStart().
  4. remove the Runnable job out of the Handler in onStop().

below are the code snippet.

public class JobDetailFragment {

private Handler m_Handler;
private Runnable m_Runnable;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    m_Runnable = new Runnable() {

        @Override
        public void run() {

            updateJobStatus();
        }
    };
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    m_Handler = new Handler();
}

@Override
public void onStart() {
    super.onStart();

    if (m_Handler != null) {
        m_Handler.postDelayed(m_Runnable, PrinterOnUIConstants.PRINT_JOB_AUTO_UPDATE_INTERVAL);
    };
}

@Override
public void onStop() {
    super.onStop();

    // cancel the potential enqueued callback.
    if (m_Handler != null) {
        m_Handler.removeCallbacks(m_Runnable);
    }
}
于 2014-02-03T20:35:20.393 に答える