0

我试图将我的问题放在下面的伪代码中:

public class something extends Activity {

    // some buttons and text view declaration
    public TextView textViewSomethingStatus;

    on create() {
            textViewSomethingStatus = (TextView) findViewById(R.id.something);
            //Here at one point i have stated thread
             new specialThread().start();
    }

    // some methods


    class specialThreads extends Thread {

         public void run() {
          //after performing some task.
          textViewSomethingStatus.setText("hello world");//This gives me crash
          }    
     }
}

当我想从另一个类更新文本框中的文本时,我遇到了崩溃。我该怎么做呢?与在 Java 中一样,我们不能扩展多个类。

编辑 :

E/AndroidRuntime(605): android.view.ViewRootImpl$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触摸它的视图。

4

5 回答 5

4

由于您specialThreadssomething班级内,因此您可以访问它。那不应该是抛出错误的那个(因为如果你不能在那里访问它,那么它本身就会显示一个编译错误)。

该错误是因为onCreate()在初始化TextView.

setContentView(R.layout.activity_main);

这是为了修复与android相关的错误。对于发布此更改后您可能会遇到的线程问题,请参阅此处发布的其他答案。

于 2013-03-28T07:52:41.320 回答
4
 public void run() {



//check some status of something here

runOnUiThread(new Runnable() {

            @Override
            public void run() {
                 textViewSomethingStatus.setText("hello world");//This will not give you crash now 

            }
        })

为什么这样 ?

阅读有关 Android 线程概念的信息。并且不要忘记纠正onCreate()错字:你写的是方法名oncreate()而不是onCreate(); 是setContentView(layout_id)的也不见了onCreate()

于 2013-03-28T07:53:31.280 回答
2

除非这是“主”线程,否则您无法从另一个线程更新您的 UI。不过,有一些方法可以在 Android 上做到这一点。我会在这里使用处理程序

此外,除非你指定什么是“崩溃”——你得到什么错误,真的很难说。

于 2013-03-28T07:52:41.940 回答
1

没有堆栈跟踪,很难确定正确的错误,但我认为你必须在你的 UI 线程上运行线程:试试那个示例代码:

something.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
                             textViewSomethingStatus.setText("hello world");//
        }
    });
于 2013-03-28T07:54:43.337 回答
1

我也遇到过你之前遇到的问题。所以这里是:


注意:(如果您只是不喜欢这个建议,请尝试将您想要使用的所有内容作为 static.ie.classes、variables 等等)


你能做的最好的事情

你应该使用BroadcastReceiver这里有一个很好的教程。.

你需要照顾的一些简单的事情......

  • 制作一个扩展的类BroadcastReceiver。(在活动本身中)

      private class RecvrPClass extends BroadcastReceiver {
    
    /**
     * 
     */
    public RecvrPClass() {
        // TODO Auto-generated constructor stub
    }
    
    /*
     * (non-Javadoc)
     * 
     * @see
     * android.content.BroadcastReceiver#onReceive(android.content.Context,
     * android.content.Intent)
     */
    @Override
    public void onReceive(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub
        // Toast.makeText(arg0, "GOT HERE", Toast.LENGTH_LONG).show();
    //fetch whatver you need to do here ;refresh();
    
    }}
    
  • 创建一个实例并注册它

     private BroadcastReceiver _refreshReceiver = new RecvrPClass();
    
    IntentFilter filter = new IntentFilter("SOME DESCRIPTION");
    
        this.registerReceiver(_refreshReceiver, filter);
    
  • SendBroadcasts 使用Intents任何你需要触发/调用实现的地方

     Intent inBiz = new Intent("SOME DESCRIPTION");
            sendBroadcast(inBiz);
    
于 2013-03-28T08:04:42.397 回答