当asynctask关闭而没有互联网连接时,应用程序崩溃

时间:2015-01-12 12:48:22

标签: android android-asynctask

我正在尝试下面的代码,当网络连接时一切正常

这是工作流程

有一个主要活动,按钮点击此活动应该打开 它会做解析部分,然后转到下一个列表活动。如果有一个背压或这个活动关闭,asynctask应该停止使用

loader.cancel(true);

如果网络可用并且在没有互联网连接的情况下测试问题,这将完美地工作

警告框显示并进入第一个活动然后崩溃

我想要显示提醒框,应用程序不应该崩溃并返回到第一个 - > mainactivity

我已经对此进行了评论 http://techiedreams.com/android-simple-rss-reader/

How to end AsyncTask onBackPress()

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.AsyncTask;
import android.os.Bundle;

import com.parser.DOMParser;
import com.parser.RSSFeed;

public class SplashActivity extends Activity {



    //private String RSSFEEDURL = "http://www.mobilenations.com/rss/mb.xml";
    RSSFeed feed;
    private AsyncLoadXMLFeed loader;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.splash);

        Intent i = getIntent();
        int position =  i.getExtras().getInt("position");
        String[] country = i.getStringArrayExtra("country");

        //Toast.makeText(getApplicationContext(), country[position], Toast.LENGTH_SHORT).show();
        //Toast.makeText(getApplicationContext(), country[position], Toast.LENGTH_SHORT).show();
        String name = i.getStringExtra("name");
        //Toast.makeText(getApplicationContext(), name, Toast.LENGTH_SHORT).show();

        ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if (conMgr.getActiveNetworkInfo() == null) {


            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage(
                    "Unable to reach server, \nPlease check your connectivity.")
                    .setTitle("TD RSS Reader")
                    .setCancelable(false)
                    .setPositiveButton("Exit",
                            new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog,
                                int id) {
                            //loader.cancel(true);
                            finish();
                        }
                    });


            AlertDialog alert = builder.create();

            alert.show();

        } else {
            // Connected - Start parsing

            loader = new AsyncLoadXMLFeed();
            loader.execute();
            //new AsyncLoadXMLFeed().execute();

        }

    }


    private class AsyncLoadXMLFeed extends AsyncTask<Void, Void, Void>{

        @Override
        protected Void doInBackground(Void... params) {

            // Obtain feed
            DOMParser myParser = new DOMParser();
            Intent i = getIntent();
            int position =  i.getExtras().getInt("position");
            String[] country = i.getStringArrayExtra("country");
            String name = i.getStringExtra("name");
            //feed = myParser.parseXml(RSSFEEDURL);
            feed = myParser.parseXml("http://"+name+".blogspot.com//feeds/posts/default/-/" + country[position] + "?alt=rss");

            return null;

        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            Bundle bundle = new Bundle();
            bundle.putSerializable("feed", feed);

            // launch List activity
            Intent intent = new Intent(SplashActivity.this, ListActivity.class);
            intent.putExtras(bundle);
            startActivity(intent);

            // kill this activity
            finish();
        }

    }

    @Override
    public void onBackPressed() {
        finish(); 
    }

    @Override
       public void onDestroy(){
          super.onDestroy();

          // Cancel the task
          loader.cancel(true);
       } 

3 个答案:

答案 0 :(得分:0)

我的猜测它与NullPointerException崩溃。

这是因为如果您没有网络连接,则无法创建AsyncLoadXMLFeed实例。 因此,当onDestroy()发生并且您调用loader.cancel(true);时,它会抛出此异常。

答案 1 :(得分:0)

终于做到了这一点 感谢anatol需要检查 loader!= null

@Override
       public void onDestroy(){
          super.onDestroy();

          // Cancel the task
          if(loader != null && loader.getStatus() != AsyncTask.Status.FINISHED) {
              loader.cancel(true);
          }

          //loader.cancel(true);
       } 

答案 2 :(得分:0)

处理此问题的最佳和最简单的解决方案是在异步任务中的 onPost execute()中使用尝试捕获阻止。像这样

        @Override
        protected void onPostExecute(String s) {
            try {
                super.onPostExecute(s);
                loading.dismiss();
            }catch (Exception ex){
                Toast.makeText(UserLogin.this, "Something is going wrong, please try again!", Toast.LENGTH_LONG).show();
            }
        }

这样可以防止您的应用崩溃。