在线程中更新UI

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-------
    }
}

但我收到了这个错误:

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

我该如何解决这个问题?


1
使用AsyncTask进行异步代码编写。 - onof
请查看https://dev59.com/HG855IYBdhLWcg3wYjWF - 所选择的解决方案应该会帮助您。 - Elemental
6个回答

1

尝试使用

postInvalidate()

而不是

invalidate()

这样做可以在下一帧中更新视图,从而提高性能。


1

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

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

但是,runOnUiThread 只能在 Activity 上运行。我现在在 View 中(我的类继承自 View 类)。 - Rasoul Taheri
如果你通过构造函数创建视图,其中将你的活动作为上下文传递(MyView myView = new MyView(MyActivity.this)),你可以通过调用Activity activity = (Activity)getContext();在你的视图中获取该活动。 - Berťák

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-android/


0

0
由于您正在扩展与UI线程绑定的View类,所以在此类中调用的任何内容都将在UI线程上运行。然而,如果您在该类内部使用了一个新线程,那么您可以依赖它的post(Runnable)方法,该方法将保证在视图的UI线程上运行。例如:
post(new Runnable() {

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

    }
});

0

这将从View类的UI线程运行;

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

        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接