【问题标题】:update ui in thread在线程中更新 ui
【发布时间】:2012-12-17 14:21:04
【问题描述】:

我创建了一个类并从视图中扩展它。还实现了 Runnable 接口。在我调用的 onTouchEvent 中:new Thread(this).start().
这是我的课:

public class test extend View interface Runnable{

    ----some code------

    public void onTouchEvent(MotionEvent event){
        ----somecode------
        new thread(this).start();
        ----somecode------
    }

    public void run(){
        -----somecode-------
        invalidate();
        -----somecode-------
    }
}

但我收到此错误:

只有创建视图层次结构的原始线程才能接触其视图

我该如何解决这个问题?

【问题讨论】:

标签: android


【解决方案1】:

尝试使用

postInvalidate()

而不是

无效()

【讨论】:

    【解决方案2】:

    你需要在 UIThread 上更新 UI,使用

    Activity activity = (Activity)getContext();
    activity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // update UI here
            invalidate();
        }
    });
    

    【讨论】:

    • 但是。 runOnUiThread 在 Activity 上工作。我在视图中(我的类从视图类扩展)。
    • 如果您通过构造函数创建视图,并在其中将活动作为上下文传递 (MyView myView = new MyView(MyActivity.this)),则可以通过在视图中调用 Activity activity = (Activity)getContext(); 来获取该活动
    【解决方案3】:

    您可以使用 handler 类通过发送消息来更改您的 UI 线程。

    http://developer.android.com/reference/android/os/Handler.html

    Android, Handler messaging

    【讨论】:

      【解决方案4】:

      由于您正在扩展绑定到 UI 线程的 View 类,因此您在此类中调用的任何内容都将在 UI 线程上运行。但是,如果您在该类中使用新线程,那么您可以依赖其post(Runnable) 方法,该方法将保证在视图的UI 线程 上运行。例如:

      post(new Runnable() {
      
          @Override
          public void run() {
              // TODO Auto-generated method stub
      
          }
      });
      

      【讨论】:

        【解决方案5】:

        这将在 View 类的 UI 线程上运行;

          post(new Runnable() {     
                @Override
                public void run() {
                    // TODO Auto-generated method stub
        
                }
            });
        

        【讨论】:

          【解决方案6】:

          在 android 中尝试 AsyncTask。它异步启动新线程,完成任务后可以更新当前 UI 而不会破坏当前 Activity。

          示例代码:

          private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
           protected Long doInBackground(URL... urls) {
               // Task which should be completed in background.
               return null;
           }
          
           protected void onProgressUpdate(Integer... progress) {
               // Task which can be done while background process is progressing , such as updatng any UI element of Activity.
               setProgressPercent(progress[0]);
           }
          
           protected void onPostExecute(Long result) {
               // Task to do after completion of asynctask.
               showDialog("Downloaded " + result + " bytes");
           }
          }
          

          您也可以使用 runOnUiThread 来完成您的任务。

          这两种方式在更新当前活动中的 UI 方面都非常有效。

          有用的链接http://developer.android.com/reference/android/os/AsyncTask.html http://sharecoding.wordpress.com/2012/05/22/simple-runonuithread-for-update-view-on-android/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-14
            • 2014-01-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多