在AsyncTask中,停止使registerReceiver()冻结应用程序

时间:2014-11-21 10:24:42

标签: java android android-asynctask

由于我终于发现registerReceiver()方法通常在UI-Thread上运行,我现在想要改变它。我只需要一些关于如何做到这一点的建议。

我如何更改registerReceiver()以停止冻结我的应用程序?

来自AsyncTask的我的doInBackground()方法运行另一个使用registerReceiver(mReceiver, filter)方法的方法(两个变量都已定义)。但是我想继续看看我的ProgressDialog,而不是让应用程序冻结。

我读到了使用Handler和一个新线程,但我需要一些帮助。

提前致谢。

代码:

package ch.scs.mod.tools.messagegenerator.business;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Typeface;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.PowerManager;
import android.telephony.SmsManager;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import ch.scs.mod.tools.messagegenerator.R;
import ch.scs.mod.tools.messagegenerator.model.Testcase;
import ch.scs.mod.tools.messagegenerator.model.Testset;

public class ReportActivity extends Activity implements OnClickListener {

    private static final String TAG = "ReportActivity";

    private TextView title;
    private TextView lblReport;
    private TextView lblEmail;
    private TableLayout tblReport;
    private Button btnBack;
    private Testset testset;
    private Testcase testcase;
    private List<Testcase> testcases = new ArrayList<Testcase>();
    private String number;
    private String apn = "not used";
    private String error;
    private ArrayList<String> resultarray = new ArrayList<String>();

    private ProgressDialog progressdialog;

    private boolean running = false;

    public enum State {
        UNKNOWN, CONNECTED, NOT_CONNECTED
    }

    private ConnectivityManager mConnMgr;
    private PowerManager.WakeLock mWakeLock;
    private ConnectivityBroadcastReceiver mReceiver;
    private NetworkInfo mNetworkInfo;

    private State mState;
    private boolean mListening;
    private boolean mSending;

    private SendMms sendMms = SendMms.getInstance();

    private MMSTest myTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.report);
        title = (TextView) findViewById(R.id.lblTitle);
        lblReport = (TextView) findViewById(R.id.lblReport);
        lblEmail = (TextView) findViewById(R.id.lblMmsEmail);
        tblReport = (TableLayout) findViewById(R.id.tblReport);
        btnBack = (Button) findViewById(R.id.btnBack);

        progressdialog = new ProgressDialog(this);
        progressdialog.setTitle("Please wait...");
        progressdialog.setMessage("Sending...");
        progressdialog.setCancelable(false);

        Typeface tf = Typeface.createFromAsset(getAssets(),
                "fonts/TheSansB_TT4_App.ttf");
        title.setTypeface(tf);
        lblEmail.setTypeface(tf);
        lblReport.setTypeface(tf);
        btnBack.setTypeface(tf);

        lblEmail.setText(Html
                .fromHtml("<a href=\'mailto:mathias.hubacher@swisscom.com\'>mathias.hubacher@swisscom.com</a>"));
        lblEmail.setMovementMethod(LinkMovementMethod.getInstance());
        btnBack.setOnClickListener(this);

        testset = (Testset) this.getIntent().getSerializableExtra("testset");
        number = (String) this.getIntent().getStringExtra("number");

        lblReport.setText(getResources().getString(R.string.reportText1) + " "
                + number + " " + getResources().getString(R.string.reportText2));
        testcases = testset.getTestcases();
        resultarray.clear();

        // Creating Views for Asynctask
        ScrollView sv = new ScrollView(this);
        LinearLayout ll = new LinearLayout(this);
        HorizontalScrollView hsv = new HorizontalScrollView(this);
        sv.setLayoutParams(new ScrollView.LayoutParams(ScrollView.LayoutParams.MATCH_PARENT, getWindowManager().getDefaultDisplay().getHeight()/2));
        sv.setVerticalScrollBarEnabled(true);
        sv.setHorizontalScrollBarEnabled(true);
        sv.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
        hsv.setLayoutParams(new HorizontalScrollView.LayoutParams(HorizontalScrollView.LayoutParams.MATCH_PARENT, HorizontalScrollView.LayoutParams.MATCH_PARENT));
        hsv.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
        ll.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        ll.setOrientation(LinearLayout.VERTICAL);
        for (Testcase testc : testcases) {
            TableRow tr = new TableRow(this);
            TextView tv = new TextView(this);
            TextView tvok = new TextView(this);
            TextView tverror = new TextView(this);
            tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT));
            tv.setText(testc.getName() + "  ");
            tv.setTextColor(getResources().getColor(R.color.white));
            tr.addView(tv);
            tvok.setText("Sending...");
            tvok.setTextColor(getResources().getColor(R.color.white));
            tverror.setText("");
            tverror.setTextColor(getResources().getColor(R.color.orange));
            tr.addView(tvok);
            tr.addView(tverror);
            ll.addView(tr);
            testc.setTextView(tv);
            testc.setTextViewOk(tvok);
            testc.setTextViewError(tverror);
        }
        hsv.addView(ll);
        sv.addView(hsv);
        tblReport.addView(sv);

        myTask = new MMSTest();
        myTask.execute();
    }

    private void createSms(List<Testcase> tcs) {
        for (Testcase testc : tcs) {
            error = "";
            if (!testc.isExecute()) {
                resultarray.add(getResources().getString(R.string.notExe));
                resultarray.add(error);
            } else {
                sendSms(number, testc);
                if (testc.isSuccsess()) {
                    resultarray.add(getResources().getString(R.string.ok));
                    resultarray.add(error);
                } else {
                    resultarray.add(getResources().getString(R.string.failed));
                    resultarray.add(error);
                }
            }
            testc.setRunning(true);
            myTask.onProgressUpdate(resultarray.get(resultarray.size()-2), resultarray.get(resultarray.size()-1));
        }
    }

    private class MMSTest extends AsyncTask<String, String, ArrayList<String>> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mReceiver = new ConnectivityBroadcastReceiver();
            IntentFilter filter = new IntentFilter();
            filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
            registerReceiver(mReceiver, filter);
//          progressdialog.show();
        }

        @Override
        protected ArrayList<String> doInBackground(String... params) {
            if (testset.getType().equals("sms")) {
                Log.v(TAG, "Testtype SMS");
                createSms(testcases);
            } else if (testset.getType().equals("mms")) {
                Log.v(TAG, "Testtype MMS");
                mListening = true;
                mSending = false;
                mConnMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//              mReceiver = new ConnectivityBroadcastReceiver();
                apn = (String) ReportActivity.this.getIntent().getStringExtra("apn");
                startMms();
            } else {
                lblReport.setText("Error Testset Type not valid");
            }
            return resultarray;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            for (Testcase testc : testcases) {
                if (testc.getRunning()) {
                    TextView tvok = testc.getTextViewOk();
                    TextView tverror = testc.getTextViewError();
                    if (testc.isExecute()) {
                        if (testc.isSuccsess()) {
                            tvok.setText(values[0]);
                            tvok.setTextColor(getResources().getColor(R.color.green));
                            tverror.setText(values[1]);
                            tverror.setTextColor(getResources().getColor(R.color.orange));
                        }
                        else {
                            tvok.setText(values[0]);
                            tvok.setTextColor(getResources().getColor(R.color.red));
                            tverror.setText(values[1]);
                            tverror.setTextColor(getResources().getColor(R.color.white));
                        }
                    }
                    else {
                        tvok.setText(values[0]);
                        tvok.setTextColor(getResources().getColor(R.color.red));
                        tverror.setText(values[1]);
                        tverror.setTextColor(getResources().getColor(R.color.white));
                    }
                    testc.setRunning(false);
                    break;
                }
            }
        }

        @Override
        protected void onPostExecute(ArrayList<String> result) {
            super.onPostExecute(result);
//          int r = 0;
//          for (Testcase testc : testcases) {
//              TextView tvok = testc.getTextViewOk();
//              TextView tverror = testc.getTextViewError();
//              if (testc.isExecute()) {
//                  if (testc.isSuccsess()) {
//                      tvok.setText(result.get(r));
//                      tvok.setTextColor(getResources().getColor(R.color.green));
//                      tverror.setText(result.get(r+1));
//                      tverror.setTextColor(getResources().getColor(R.color.orange));
//                  }
//                  else {
//                      tvok.setText(result.get(r));
//                      tvok.setTextColor(getResources().getColor(R.color.red));
//                      tverror.setText(result.get(r+1));
//                      tverror.setTextColor(getResources().getColor(R.color.white));
//                  }
//              }
//              else {
//                  tvok.setText(result.get(r));
//                  tvok.setTextColor(getResources().getColor(R.color.red));
//                  tverror.setText(result.get(r+1));
//                  tverror.setTextColor(getResources().getColor(R.color.white));
//              }
//              r = r + 2;
//          }
//          progressdialog.dismiss();
        }
    }

    private void sendMms() {
        int responseCode=0;
        for (Testcase testc : testcases) {
            error = "";
            if (testc.isExecute()) {
                File file = new File(Environment.getExternalStorageDirectory(), ".MODTest/" + testc.getContentFile()); 
                if (file.exists()) {
                    if (file.length() > 300000) {
                        Log.v(TAG, "File Length="+ Long.toString(file.length()));
                        error=getResources().getString(R.string.warningFileSize);
                    }
                    responseCode = sendMms.startMms(testc.getSubject(), number, apn, testc.getContentFile(), testc.getContentType(), getApplicationContext());
                Log.v(TAG,"Test: "+ testc.getName() + " / Response code: " + Integer.toString(responseCode));

                if (responseCode == 200) {
                    testc.setSuccsess(true);
                    responseCode = 0;
                } else {
                    testc.setSuccsess(false);
                    error =Integer.toString(responseCode);
                }
                } else {
                    testc.setSuccsess(false);
                    error =getResources().getString(R.string.errorNoFile);
                }
                if (testc.isSuccsess()) {
                    resultarray.add(getResources().getString(R.string.ok) + "  ");
                    resultarray.add(error);
                } else {
                    resultarray.add(getResources().getString(R.string.failed) + "  ");
                    resultarray.add(error);
                }
            } else {
                resultarray.add(getResources().getString(R.string.notExe));
                resultarray.add(error);
            }
            testc.setRunning(true);
            myTask.onProgressUpdate(resultarray.get(resultarray.size()-2), resultarray.get(resultarray.size()-1));
        }
        endMmsConnectivity();
        mSending = false;
        mListening = false;
    }

    public void startMms() {

        for (Testcase tcs : testcases) {
            testcase = tcs;
            number = number + "/TYPE=PLMN";

//          IntentFilter filter = new IntentFilter();
//          filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
//          registerReceiver(mReceiver, filter);

            try {
                // Ask to start the connection to the APN. Pulled from Android
                // source code.
                int result = beginMmsConnectivity();
                Log.v(TAG, "Result= " + Integer.toString(result));

                if (result != PhoneEx.APN_ALREADY_ACTIVE) {
                    Log.v(TAG, "Extending MMS connectivity returned " + result
                            + " instead of APN_ALREADY_ACTIVE");
                    // Just wait for connectivity startup without
                    // any new request of APN switch.
                    return;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void sendSms(String nr, Testcase tc) {
        if (!tc.getBody().equals("")) {
            SmsManager sm = SmsManager.getDefault();
            sm.getDefault().sendTextMessage(nr, null, tc.getBody(), null, null);
            tc.setSuccsess(true);
        } else {
            tc.setSuccsess(false);
            error = getResources().getString(R.string.errorEmptySms);
        }
    }

    @Override
    public void onClick(View v) {
        if (v.equals(findViewById(R.id.btnBack))) { // Wenn Button zurück
                                                    // geklickt wird
            Intent startMmsTest = new Intent(ReportActivity.this,
                    StartActivity.class);
            startActivity(startMmsTest);
        }
    }

    protected void endMmsConnectivity() {
        // End the connectivity
        try {
            Log.v(TAG, "endMmsConnectivity");
            if (mConnMgr != null) {
                mConnMgr.stopUsingNetworkFeature(
                        ConnectivityManager.TYPE_MOBILE,
                        PhoneEx.FEATURE_ENABLE_MMS);
            }
        } finally {
            releaseWakeLock();
        }
    }

    protected int beginMmsConnectivity() throws IOException {
        // Take a wake lock so we don't fall asleep before the message is
        // downloaded.
        createWakeLock();

        int result = mConnMgr.startUsingNetworkFeature(
                ConnectivityManager.TYPE_MOBILE, PhoneEx.FEATURE_ENABLE_MMS);

        Log.v(TAG, "beginMmsConnectivity: result=" + result);

        switch (result) {
        case PhoneEx.APN_ALREADY_ACTIVE:
        case PhoneEx.APN_REQUEST_STARTED:
            acquireWakeLock();
            return result;
        }

        throw new IOException("Cannot establish MMS connectivity");
    }

    private synchronized void createWakeLock() {
        // Create a new wake lock if we haven't made one yet.
        if (mWakeLock == null) {
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                    "MMS Connectivity");
            mWakeLock.setReferenceCounted(false);
        }
    }

    private void acquireWakeLock() {
        // It's okay to double-acquire this because we are not using it
        // in reference-counted mode.
        mWakeLock.acquire();
    }

    private void releaseWakeLock() {
        // Don't release the wake lock if it hasn't been created and acquired.
        if (mWakeLock != null && mWakeLock.isHeld()) {
            mWakeLock.release();
        }
    }

    private class ConnectivityBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            int responseCode;
            String action = intent.getAction();

            if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)
                    || mListening == false) {
                Log.w(TAG, "onReceived() called with " + mState.toString()
                        + " and " + intent);
                return;
            }

            boolean noConnectivity = intent.getBooleanExtra(
                    ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

            if (noConnectivity) {
                mState = State.NOT_CONNECTED;
            } else {
                mState = State.CONNECTED;
            }

            mNetworkInfo = (NetworkInfo) intent
                    .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            // mOtherNetworkInfo = (NetworkInfo) intent
            // .getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO);

            // mReason =
            // intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
            // mIsFailover =
            // intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER,
            // false);

            // Check availability of the mobile network.
            if (mNetworkInfo == null) {
                /**
                 * || (mNetworkInfo.getType() !=
                 * ConnectivityManager.TYPE_MOBILE)) {
                 */
                Log.v(TAG, "   type is not TYPE_MOBILE_MMS, bail");
                return;
            }

            if (!mNetworkInfo.isConnected()) {
                Log.v(TAG, "   TYPE_MOBILE_MMS not connected, bail");
                return;
            } else {
                Log.v(TAG, "connected..");

                if (mSending == false) {
                    mSending = true;

                    sendMms();
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

根据您的需要,将其移至onProgressUpdate()方法,或更好,onPostExecute() / onPreExecuteMethod()

这些方法在UI线程上运行,而不是在由Asynctask

创建的新线程上运行
相关问题