2016-12-17 6 views
0

Я создал простую почтовую программу, которая использует AsyncTask для выполнения. В методе doInBackground я инициирую объект Mail класса, который создает почтовый объект, который принимает параметры, такие как учетные данные, объект электронной почты, тело и приложение. В любом случае, я хочу getText() из нескольких полей EditText и передать их как тело письма, но проблема в том, что я не могу использовать метод getText() внутри метода doInBackground, поэтому это создает проблему.Метод getText должен быть вызван из потока пользовательского интерфейса, текущий вывод - рабочий

Вот и весь основной вид деятельности. Я не могу найти способ логически обойти это эффективным образом.

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, перед началом задания или

  • Pass значения в метод execute() и забрать их в качестве параметров к doInBackground() или

  • Реализовать onPreExecute() и извлекать значения из там

+0

Bottom Я делаю объект Mail внутри метода doInBackground', так как я должен получать значения внутри 'onPreExecute' в методе' doInBackground'? – MilesWeirdo

+0

@MilesWeirdo: Добавить поля в MailSender. Заполните эти поля, используя конструктор (первая пуля), сеттеры (вторая пуля) или 'onPreExecute()' (четвертая пуля). Прочитайте поля в 'doInBackground()'. Просто убедитесь, что, если вы используете подход настройки, который вы называете теми сеттерами до вызова 'execute()' для запуска задачи. – CommonsWare

+0

Спасибо большое, удалось обойти его. – MilesWeirdo

0

@CommonsWare предложить четыре способа доступа значения. Реализовать четвёртую ниже

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 
     } 
    } 

И получить вид в методе OnCreate

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

Позовите AsyncTask как:

new MainActivity.MailSender().execute(spElk.getSelectedItem().toString() + etM.getText().toString(), etU.getText().toString()); 
Смежные вопросы

 Смежные вопросы