3

我创建了一个类并从视图中扩展它。还实现了 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-------
    }
}

但我收到此错误:

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

我怎样才能解决这个问题?

4

6 回答 6

1

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

Activity activity = (Activity)getContext();
activity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // update UI here
        invalidate();
    }
});
于 2012-12-17T14:24:00.260 回答
1

尝试使用

postInvalidate()

代替

无效()

于 2012-12-17T14:31:56.097 回答
0

您可以使用处理程序类通过发送消息对您的 UI 线程进行更改。

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

Android,处理程序消息

于 2012-12-17T14:26:11.773 回答
0

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

post(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub

    }
});
于 2012-12-17T14:35:27.293 回答
0

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

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

        }
    });
于 2012-12-17T14:36:31.630 回答
0

在 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-安卓/

于 2012-12-26T12:53:24.533 回答