0

Eric Nordvikは、この問題についてしばらくの間私を助けてくれました。

この質問はAsyncTaskの質問に進化したので、ここに移動すると思いました。印刷ボタン(btnPrintTardy)をクリックすると、AsyncTaskを開始して、編集テキストフィールド(editText1)にあるものをFileWriter経由でSDカードに.textとして保存します。

これまでのところ、「FileWriterTask」と呼ばれる私のAsyncTaskがあります

package com.android.upgrayeddapps.latepass;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

import android.content.Context;
import android.os.AsyncTask;
import android.view.View;
import android.widget.Toast;

public class FileWriterTask extends AsyncTask<String, Void, Void> {
      @Override
      protected Void doInBackground(String... params) {
        // write in data folder
            try {
                File myFile = new File("/sdcard/StudentLatePass.txt");
                myFile.createNewFile();
                FileOutputStream fOut = new FileOutputStream(myFile);
                OutputStreamWriter myOutWriter = 
                                        new OutputStreamWriter(fOut);
                myOutWriter.append(params[0]);
                myOutWriter.close();
                fOut.close();
                Toast.makeText(getBaseContext(),
                        "Finished writing StudentLatePass.txt'",
                        Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                Toast.makeText(getBaseContext(), e.getMessage(),
                        Toast.LENGTH_SHORT).show();
            }

                    finish();
                    return null;
                    }

    private Context getBaseContext() {
        // TODO Auto-generated method stub
        return null;
    }



    private void finish() {
        // TODO Auto-generated method stub

    };

    public void onClick(View v) {
        // clear text box
        finish();
    }
      }

Student Activity内で、このコードを使用してFileWriterTaskを呼び出しています。

public void UpdateStudenttxtfile(View View)
    {
        EditText txtData = (EditText) findViewById(R.id.editText1);
        FileWriterTask task = new FileWriterTask();
        task.execute(txtData.getText().toString());

    }

私のstudentActivityレイアウトでは、クリックの「印刷ボタン」を次のように設定しています。

android:onClick="UpdateStudenttxtfile"

これを実行すると、いくつかの例外が発生し、プログラムがクラッシュします。

I/dalvikvm(337): Jit: resizing JitTable from 512 to 1024

W/dalvikvm(337): threadid=9: thread exiting with uncaught exception (group=0x40015560)

E/AndroidRuntime(337): FATAL EXCEPTION: AsyncTask #1

E/AndroidRuntime(337): java.lang.RuntimeException: An error occured while executing doInBackground()

E/AndroidRuntime(337):  at android.os.AsyncTask$3.done(AsyncTask.java:200)

E/AndroidRuntime(337):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)

E/AndroidRuntime(337):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125)

E/AndroidRuntime(337):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)

E/AndroidRuntime(337):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)

E/AndroidRuntime(337):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)

E/AndroidRuntime(337):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)

E/AndroidRuntime(337):  at java.lang.Thread.run(Thread.java:1019)

E/AndroidRuntime(337): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

E/AndroidRuntime(337):  at android.os.Handler.<init>(Handler.java:121)

E/AndroidRuntime(337):  at android.widget.Toast.<init>(Toast.java:68)

E/AndroidRuntime(337):  at android.widget.Toast.makeText(Toast.java:231)

E/AndroidRuntime(337):  at com.android.upgrayeddapps.latepass.FileWriterTask.doInBackground(FileWriterTask.java:29)

E/AndroidRuntime(337):  at com.android.upgrayeddapps.latepass.FileWriterTask.doInBackground(FileWriterTask.java:1)

E/AndroidRuntime(337):  at android.os.AsyncTask$2.call(AsyncTask.java:185)

E/AndroidRuntime(337):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

E/AndroidRuntime(337):  ... 4 more

D/dalvikvm(337): GC_CONCURRENT freed 1381K, 60% free 2709K/6727K, external 2011K/2137K, paused 7ms+8ms

I/Process(337): Sending signal. PID: 337 SIG: 9
4

1 に答える 1

1

Androidでは、UIスレッド以外のスレッドからUIを更新することはできません。あなたのコードdoInBackground()では、別のスレッドで実行されているトーストを示しています。

于 2012-03-15T19:12:01.970 に答える