发送电子邮件和SQlite数据库操作一个意图新线程

时间:2016-07-10 02:17:12

标签: java android multithreading sqlite email

我的应用程序中的一个功能是发送电子邮件。通过查询SQLite数据库表生成电子邮件列表。因此,在同一活动中从SQLite数据库发送电子邮件和查询数据。它不起作用。如果我在简单的应用程序中应用代码,则发送电子邮件代码。查询有效。当我把它们放在一起时,它无法正常工作。在线阅读后,我的感觉是我需要创建一个处理SQLite数据库查询的新线程。我是android和java的新手,并且不知道如何创建新线程(背景)。 有人能帮帮我吗?非常感谢!!!!!

我的活动代码如下:

package jhapps.com.demographics;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class PromotionEmailMonthTop10 extends Activity {
private EditText subjectGroupTop10,bodyGroupTop10;
private Button  btnMonthTop10;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_promotion_email_month_top10);


    subjectGroupTop10=(EditText)findViewById(R.id.subjectMonthTop10);
    bodyGroupTop10=(EditText)findViewById(R.id.bodyMonthTop10);
    btnMonthTop10=(Button)findViewById(R.id.btnMonthTop10);
    btnMonthTop10.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EmailMonthTop10();

            // after sending the email, clear the fields

            subjectGroupTop10.setText("");
            bodyGroupTop10.setText("");
        }


    });


}

//get month top 10 email list
protected void EmailMonthTop10() {



            DataBaseHelper dataBaseHelper=new DataBaseHelper(PromotionEmailMonthTop10.this);
            String[] emailGroupTop10=new String[dataBaseHelper.eMailListMonthTop10().size()];
            for(int i=0;i<dataBaseHelper.eMailListMonthTop10().size();i++){
                emailGroupTop10[i]=dataBaseHelper.eMailListMonthTop10().get(i);
            }



    String subjects=subjectGroupTop10.getText().toString();
    String bodytext=bodyGroupTop10.getText().toString();

    //start email intent

            Intent email = new Intent(Intent.ACTION_SENDTO);

            // prompts email clients only
            email.setType("message/rfc822");
            email.setData(Uri.parse("mailto:"));


          email.putExtra(Intent.EXTRA_EMAIL,emailGroupTop10 );
          // email.putExtra(Intent.EXTRA_EMAIL,new String []{"junrudeng@gmail.com","huangji8@gmail.com"});

            email.putExtra(Intent.EXTRA_SUBJECT, subjects);

            email.putExtra(Intent.EXTRA_TEXT, bodytext);
            try {
                // the user can choose the email client

                startActivity(Intent.createChooser(email, "Choose an email client from..."));
            } catch (android.content.ActivityNotFoundException ex) {

                Toast.makeText(PromotionEmailMonthTop10.this, "No email client installed.",
                        Toast.LENGTH_LONG).show();
            }



        }

}

1 个答案:

答案 0 :(得分:0)

您永远不应该在主线程上执行数据库查询或网络调用。如果您想查询数据库以显示数据,您可能希望AsyncTask为此。

以下内容应该有效:

public class PromotionEmailMonthTop10 extends Activity {

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        btnMonthTop10.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new SendEmailTop10Task().execute();
            }
        });
    }


    class SendEmailTop10Task extends AsyncTask<Void, Void, Void> {

        // This is called on a seperate thread
        @Override
        protected Void doInBackground(Void... voids) {
            EmailMonthTop10();
        }

        // This is called on the main thread
        @Override
        protected void onPostExecute(Integer status) {
            subjectGroupTop10.setText("");
            bodyGroupTop10.setText("");
        }
    }       
}

请考虑在考虑java naming conventions的情况下重命名您的方法