2016-12-17 3 views
0

私は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メソッド内の私のメーリングオブジェクトに渡す方法だけが必要です。

+0

使用 'findViewById'は' onPreExecute'代わりに 'doInBackground' –

答えて

0

あなたは可能性:

  • は、あなたがクラスに追加MailSenderコンストラクタに値を渡し、または

  • コールセッター前にタスクを開始するあなたはMailSenderに追加する方法を、または

  • ​​メソッドに値を渡すとdoInBackground()にパラメータとしてそれらを拾う、または

  • onPreExecute()を実装し@CommonsWareが値にアクセスするために4つの方法を提案

+0

底に私は 'doInBackground'メソッドの中で' onPreExecute 'の中で値を取り出すことになっていますか? – MilesWeirdo

+0

@MilesWeirdo: 'MailSender'にフィールドを追加します。コンストラクタ(第1の箇条書き)、セッター(第2の箇条書き)、または 'onPreExecute()'(第4の箇条書き)を使用して、これらのフィールドに値を設定します。 'doInBackground()'のフィールドを読んでください。 settersアプローチを使用する場合は、 'execute()'を呼び出す前にこれらのsetterを呼び出して、タスクを開始するようにしてください。 – CommonsWare

+0

ありがとう、それを回避するために管理されます。 – MilesWeirdo

0

そこから値を取得します。

class MailSender extends AsyncTask<String, Integer, Integer> 
    { 

     ProgressDialog pd = null; 
     /* (non-Javadoc) 
     * @see android.os.AsyncTask#onPreExecute() 
     */ 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
     //rest of your code 
     } 

     /* (non-Javadoc) 
     * @see android.os.AsyncTask#doInBackground(Params[]) 
     */ 

     @Override 
     protected Integer doInBackground(String... params) { 
     //rest of code 
     //you can get values params[0],params[1] simillarly 
      return yourIntValue; 
     } 

     /* (non-Javadoc) 
     * @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
     */ 

     @Override 
     protected void onPostExecute(Integer result) { 
      //rest of your code 
     } 
    } 

以下のように第四実施し、

etM = (EditText)findViewById(R.id.etM); 
      etU = (EditText)findViewById(R.id.etU); 
      etO = (EditText)findViewById(R.id.etO); 

今すぐとしてasyncTaskを呼び出すのonCreateメソッドでビューを取得:

new MainActivity.MailSender().execute(spElk.getSelectedItem().toString() + etM.getText().toString(), etU.getText().toString()); 
関連する問題