来自AsynchTask的运行时异常

时间:2013-08-21 03:40:40

标签: android android-asynctask

我有一个弹出系统,用Textview显示弹出警报。 Popup类(如下所示)是通过另一个类的Intent调用的。 Popup类的代码在onCreate方法上显示Popup时起作用(完成它的代码显示在oncreate类的块注释中)。但是,我的功能是创建弹出窗口,以便它不会停止/暂停后台应用程序。几乎可以获得Toast的功能。在不中断后台应用程序的情况下显示弹出窗口。所以我决定使用AsynchTask实现它,但我一直得到运行时异常。有人能引导我走正确的道路吗?我相信我必须实现一个onPostExecute但不确定我应该怎么做。

public class Popups extends Activity {
 private Dialog mDialog;
//static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.popups);

    //IntentFilter filter = new IntentFilter(ACTION);
    //this.registerReceiver(mReceivedSMSReceiver, filter);
    /*
    String message = getIntent().getStringExtra("message");

    TextView messageView = (TextView) findViewById(R.id.message);
    messageView.setText(message);

    Handler handler = new Handler();
    long delay = 5000;

    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Popups.this.finish();
        }
    }, delay);
    */
    PopupAsynch myPopup = new PopupAsynch();
    myPopup.execute(1);
}
private class PopupAsynch extends AsyncTask<Integer, Void, Integer>
{
    TextView messageView = (TextView) findViewById(R.id.message);
    String message = getIntent().getStringExtra("message");
    @Override
    protected Integer doInBackground(Integer... params) {


        Handler handler = new Handler();
        long delay = 5000;

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Popups.this.finish();
            }
        }, delay);

        messageView.setText(message);   

        return 1;

    }

}


}

3 个答案:

答案 0 :(得分:0)

首先显示弹出窗口的实现是不正确的。

您创建的第二个处理程序没有附加您的UI线程,您需要在此处理程序上调用Looper以将其附加到UI线程。

如果你使用更好的评论代码,而不是这个AsyncTask。

答案 1 :(得分:0)

Handler handler = new Handler();

这是使用AsyncTask线程循环器。任何从中更改UI的尝试都会导致错误。

代码中的AsyncTask似乎毫无用处。为什么不仅从Activity代码发布延迟到主处理程序?

答案 2 :(得分:0)

使用计时器正确实施

private Timer timer;

timer = new Timer();
                    timer.schedule(new TimerTask() {

                        @Override
                        public void run() {
                            runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    Popups.this.finish();
                                    messageView.setText(message); 
                                }
                            });
                        }
                    }, 0, 5000);