【问题标题】:app crashes when asynctask closed with no internet connection当 asynctask 在没有互联网连接的情况下关闭时应用程序崩溃
【发布时间】:2015-03-10 05:50:48
【问题描述】:

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

这是工作流程

有一个主要的活动,点击按钮应该打开这个活动 它将执行解析部分,然后转到下一个列表活动。如果有后按或此活动已关闭,则 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);
       } 

    

【问题讨论】:

  • 发布带有问题的崩溃日志
  • 您是否设置了权限 ACCESS_NETWORK_STATE ?
  • 是的,网络连接一切正常

标签: android android-asynctask


【解决方案1】:

我猜它会因 NullPointerException 而崩溃。

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

【讨论】:

    【解决方案2】:

    终于做到了
    感谢 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);
           } 
    

    【讨论】:

      【解决方案3】:

      处理此问题的最佳和最简单的解决方案是在异步任务中的 onPost execute() 中使用 try catch 块。像这样

              @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();
                  }
              }
      

      这将防止您的应用崩溃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        • 2015-10-24
        相关资源
        最近更新 更多