从其他线程访问视图(Android)

Yur*_*yak 7 java multithreading android

我正在开发一个Android应用程序,我有一个启动/暂停某些模拟过程的按钮.在此过程运行时,我需要实时输出一些数据.但是当我为模拟创建一个新线程时,我无法从该线程访问视图(让它成为TextView),因为它们只能从创建它们的线程访问.另一方面,新线程是必要的,因为否则用户在模拟运行时将无法执行任何操作(例如,按某些其他按钮).在这种情况下,创建新服务还需要创建新线程.我该如何解决这个问题?

use*_*305 6

你可以用很多方式处理它,

  1. 尝试在此使用AsyncTask,您的后台工作在doInBackGround()方法中完成,并且您的UI不会阻塞,您还可以通过publishProgress()和onProgressUpdate()通过其上下文从您调用AsyncTask的位置访问Activity的视图.

  2. 如果您使用的是简单的线程,然后使用Handler或message或runOnUiThread,则可以更新主线程的视图.

但, in your way I think AsyncTask is best for you.


Ada*_*man 5

您可以使用android.os.Handler解决问题。Handler 实例绑定到创建它的线程,您可以将 Runnables 发送给它,它将在它绑定的线程中执行它们。例如:

import android.os.Handler;
import android.widget.TextView;

public class MyActivity extends Activity {
  private Handler uiHandler;
  private TextView simulationStatus;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    ...
    uiHandler = new Handler();
    ...
    simulationStatus = (TextView) findViewById(R.id.simulationStatus);
    ...
  }

  // This method is to be executed on the simulation thread.
  public void simulate() {
    ...
    final String simulationStatusText = ...;
    ...
    uiHandler.post(new Runnable() {
      @Override
      public void run() {
        // This is run on the UI thread.
        simulationStatus.setText(simulationStatusText);
        ...
      }
    });
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用AsyncTask。例如,请参阅链接。