私はAsyncTaskを使って実行する単純なメールアプリケーションを作っています。 doInBackgroundメソッドでは、資格情報、電子メールの件名、本文、添付ファイルなどのパラメータを取り込むメールオブジェクトを作成するクラスのMailオブジェクトを開始します。とにかく、私はいくつかのEditTextフィールドからgetText()を行い、それらをメール本体として渡したいのですが、問題は私がdoInBackgroundメソッド内でgetText()メソッドを使うことができないためです。メソッドgetTextはUIスレッドから呼び出されなければなりません。現在推論されているスレッドはworkerです
ここでは主な活動全体を示します。論理的にこれを効率的にバイパスする方法を見つけることはできません。
public class MainActivity extends Activity {
public static File imageFile;
public static EditText etM, etU, etO;
public static Spinner elk;
String[] elks = {"ED 1", "ED 2", "ED 3", "ED 4", "ED 5", "ED 6",
"ED 7", "ED 8", "ED 9", "ED 10", "ED 11"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, elks);
spElk = (Spinner) findViewById(R.id.spElk);
spElk.setAdapter(adapter);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
final Button send = (Button) this.findViewById(R.id.bSubmit);
send.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new MainActivity.MailSender().execute();
}
});
Button ibCam = (Button) findViewById(R.id.ibCam);
ibCam.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
imageFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "temp.jpg");
Uri tempUri = Uri.fromFile(imageFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, 0);
}
});
}
class MailSender extends AsyncTask<Void, Integer, Integer>
{
ProgressDialog pd = null;
/* (non-Javadoc)
* @see android.os.AsyncTask#onPreExecute()
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = new ProgressDialog(MainActivity.this);
pd.setTitle("Uploading...");
pd.setMessage("Uploading logs. Please wait...");
pd.setCancelable(false);
pd.show();
}
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected Integer doInBackground(Void... params) {
etM = (EditText)findViewById(R.id.etM);
etU = (EditText)findViewById(R.id.etU);
etO = (EditText)findViewById(R.id.etO);
Mail m = new Mail("[email protected]", "pw123123");
String toAddresses = "[email protected]";
m.setToAddresses(toAddresses);
m.setFromAddress("[email protected]");
m.setMailSubject("Email subject");
m.setMailBody(spElk.getSelectedItem().toString() + etM.getText().toString(), etU.getText().toString());
try {
m.addAttachment(imageFile.getAbsolutePath());
if (m.send()) {
System.out.println("Message sent");
return 1;
} else {
return 2;
}
} catch (Exception e) {
Log.e("MailApp", "Could not send email", e);
}
return 3;
}
/* (non-Javadoc)
* @see android.os.AsyncTask#onPostExecute(java.lang.Object)
*/
@Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
pd.dismiss();
if(result==1)
Toast.makeText(MainActivity.this, "Sent.", Toast.LENGTH_LONG).show();
else if(result==2)
Toast.makeText(MainActivity.this, "Not sent.", Toast.LENGTH_LONG).show();
else if(result==3)
Toast.makeText(MainActivity.this, "Error sending message.", Toast.LENGTH_LONG).show();
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 0){
switch(resultCode){
case Activity.RESULT_OK:
if(imageFile.exists()){
Toast.makeText(this, "Image saved at: " + imageFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
}
break;
case Activity.RESULT_CANCELED:
Toast.makeText(this, "Error submitting image", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
}
}
フィールドの名前の不一致は無視してください。私は、これらの値を取得し、それらをdoInBackgroundメソッド内の私のメーリングオブジェクトに渡す方法だけが必要です。
使用 'findViewById'は' onPreExecute'代わりに 'doInBackground' –