0

私のAndroidアプリでは、ASYNCタスクを利用しようとしています... 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スレッドで実行されないため、ここでedittextのテキストを設定することはできません

edittext値を設定する場合は、doInBackGroundで値を返し、onPostExecuteでパラメーター値を使用して、onPostExecute()で設定します。

于 2013-03-13T18:55:05.327 に答える
0

で何かをすることはできませUIdoInBackground()。これは、他の方法のいずれかで実行する必要があります。あなたの目的のために、おそらくonPostExecture()

AsyncDocsを見てください。メイン( )スレッドdoInBackground()では実行されません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 に答える