1

我在 android 中实现了一个线程,它每 1 秒刷新一次片段(一些文本列表)。

它在线程调用片段方法时给出运行时错误,。这是我的代码

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 调用片段方法,一切正常,因为我需要在后台每 5 秒刷新一次线程,我已经像这样实现了,但它不起作用..请建议解决方案...

4

5 回答 5

5

我认为你必须在

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

或通过 aHandler或通过 apost()或在 anAsyncTaskonProgress()

于 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

除了 UI 线程,您不能在任何线程上更新 UI。如果要更新线程,可以使用每秒发送一条消息的处理程序(处理程序处理主 UI 线程上的所有消息)。

从 Thread 更新 UI

于 2012-07-12T17:08:15.143 回答
0

您还可以在线程中广播 Intent (context.sendBroadcast(intent)) 并在 Activity 中接收它:Broadcast Receiver

于 2012-10-03T23:21:52.990 回答
0

也许您可以在片段中完成所有工作。这是步骤。

  1. 在片段中定义 Handler 和 Runnable。
  2. 在 onCreate() 和 onAttach() 中创建 Handler 和 Runnable
  3. 在 onStart() 中的 Handler 中发布 Runnable 作业。
  4. 在 onStop() 中将 Runnable 作业从 Handler 中移除。

下面是代码片段。

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 回答