0

Eric Nordvik이 시간에이 issue로 큰 도움이되었습니다.Eclipse의 Android - 버튼 클릭시 AsyncTask가 FileWriter를 시작합니다.

이 질문은 일종의 AsyncTask 질문으로 발전 했으므로 여기로 옮길 것입니다. 내 인쇄 버튼 (btnPrintTardy)이 클릭되면 AsyncTask를 시작하여 FileTriter를 통해 편집 텍스트 필드 (editText1)에있는 내용을 SD 카드에 .text로 저장합니다. 지금까지 여기

은 내 AsyncTask를은 "FileWriterTask"내 학생 활동 내부

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(); 
    } 
     } 

이 코드 내 FileWriterTask를 호출하고 호출된다. 나는이 내가 몇 가지 예외를 제외하고 프로그램 충돌을 얻고 실행할 때 내 studentActivity 레이아웃에서

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

    } 

는 내가 "printbutton의"클릭 세트에

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 
+0

실제로이 작업을 수행하려면 AsyncTask가 필요합니까? 내 말은 - 누군가가 그 EditText에 얼마나 많은 것을 쓸 것인가? – hovanessyan

+0

결국 우리는 데이터베이스의 데이터를 공급할 것입니다. 예 : 학생 이름, 시간, 기간, 지연 카운트, 경고 등. 나는 안드로이드에 처음 왔으므로 이것을 처리하는 가장 좋은 방법에 긍정적이지 않습니다. – UPGRAYEDD

답변

1

Android에서는 UI 스레드가 아닌 다른 스레드에서 UI를 업데이트 할 수 없습니다. 코드에서 별도의 스레드에서 실행중인 doInBackground()에 토스트가 표시됩니다.

관련 문제