0

在我的 android 应用程序中,我正在尝试使用 ASYNC Task ...每当我在 doInBackground(...) 中设置 EditText 的任何 TextView 的文本时 .... 我收到一个错误,但是当我在 onCreate 中设置相同时,它有效.. :( 这是代码:

public class RemoteFiles extends Activity {



EditText etrmm ;
TextView t;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_remote_files);
    initVars();         
    new ConnectToServer().execute(null);



}
protected void initVars(){
    etrmm =(EditText)findViewById(R.id.etRM);
    etrmm.setText("UnSET");
    t=(TextView)findViewById(R.id.RM);
    t.setText("UnsET");
}
public class ConnectToServer extends AsyncTask<String, Integer, Void> {

    //private ProgressDialog pd = new ProgressDialog(RemoteFiles.this);
    private ProgressDialog pdd ;
    @Override
    protected Void doInBackground(String... params) {
        // TODO Auto-generated method stub

        for(int i=0;i<20;i++){
            publishProgress(5);
            try {
                Thread.sleep(88);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        etrmm.setText("Edittext SET");

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        pdd.dismiss();

    }

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        // pd.setMessage("Connecting to server... ");
        // pd.show();

        pdd = new ProgressDialog(RemoteFiles.this);
        pdd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pdd.setMax(100);
        pdd.show();




    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
        pdd.incrementProgressBy(values[0]);

    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_remote_files, menu);
    return true;
}}

这是布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
    android:id="@+id/RM"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"

    android:padding="@dimen/padding_medium"
    android:text="@string/hello_world"
    tools:context=".RemoteFiles" />

<EditText
    android:id="@+id/etRM"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:ems="10" >

    <requestFocus />
</EditText>

logcat 说 android.view.ViewRoot$CalledFromWrongThreadException

4

3 回答 3

1

doInBackground(String... params) 不在 UI Thread 上运行,所以你不能在那里为 edittext 设置文本

如果要设置edittext值,请返回doInBackGround中的值并使用onPostExecute中的参数值并将其设置在onPostExecute()中

于 2013-03-13T18:55:05.327 回答
0

你不能UIdoInBackground(). 这应该在任何其他方法中完成。出于您的目的,可能onPostExecture()

看看AsyncDocsdoInBackground()不在 main ( UI) 线程上运行

于 2013-03-13T18:55:00.787 回答
0

AsyncTask 的 onpreExecute 和 onPostExecute 方法在 UI 线程上运行。您可以在此处更改 UI。doInBackground 不在 UI 线程上运行。它用于执行长时间运行的操作。在后台线程中运行。您无法从 doinBackground 中的后台线程更新 ui。

在 asynctask 的 onPostExecute 方法中的 textview 中设置文本。

开发人员站点中的文档在标题“THE 4 STEPS”下提供了有关该主题的详细信息。http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-03-13T18:59:58.967 回答