Android 如何处理大型任务中的internet连接更改

Android 如何处理大型任务中的internet连接更改,android,json,crash,Android,Json,Crash,我正在开发一个Android应用程序,它可以在AsyncTask中完成大量工作(可以是5分钟的AsyncTask活动) 此任务需要internet连接,因此在开始时,我会检查设备是否联机 但是,如果用户在GraphRequest运行时将连接从wi-fi更改为移动连接或脱机,我会因以下错误而崩溃: 原因:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“org.json.JSONObject org.json.JSONObject.getJSONObjec

我正在开发一个Android应用程序,它可以在AsyncTask中完成大量工作(可以是5分钟的AsyncTask活动)

此任务需要internet连接,因此在开始时,我会检查设备是否联机

但是,如果用户在GraphRequest运行时将连接从wi-fi更改为移动连接或脱机,我会因以下错误而崩溃:

原因:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“org.json.JSONObject org.json.JSONObject.getJSONObject(java.lang.String)”

以下是代码中崩溃的部分:

// I Check if the device is online, if yes:

for(j=0; j<n_foto_pub;j++) {

        GraphRequest request2 = GraphRequest.newGraphPathRequest(
                AccessToken.getCurrentAccessToken(),
                "MY_QUERY",
                new GraphRequest.Callback() {
                    @Override
                    public void onCompleted(GraphResponse response) {

                        try {                                
                            JSONObject obj1 = response.getJSONObject();
                            JSONObject obj2 = obj1.getJSONObject("data1");  <--- CRASH HERE
                            JSONObject obj3 = obj2.getJSONObject("data2");  
                            int ris = obj3.getInt("ris");                            
                            ..........

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

                    }
                });
        request2.executeAndWait();
        }
//我检查设备是否在线,如果是:

对于(j=0;j参见下面的代码,u将得到更好的想法

    @Override
  protected String doInBackground(String... params) {
  {
    try
    {
        //Your operation always inside try catch block to avoid crash.
        for(j=0; j<n_foto_pub;j++) 
        {
           if(checkInternet()) //check internet for each loop
           {

           }
           else
           {
             callBackActivity();
           }
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
         callBackActivity();
    }
  }
@覆盖
受保护的字符串doInBackground(字符串…参数){
{
尝试
{
//您的操作始终在试抓块内,以避免碰撞。

对于(j=0;jMy循环中的JSON请求非常长,因此我认为在任何情况下,使用此解决方案都很有可能发生崩溃。try-catch块中的第一个JSON请求使应用程序永远不会崩溃,它只会得到异常。当异常到达simple callbackActivity()时方法。我更新了我的答案。如果我的答案对你有帮助。那么接受&upvote。它将帮助其他人。高兴地帮助@GMXSeem工作…现在在捕获上,我必须杀死AsyncTask,你知道怎么做吗?this.stop()似乎不工作MasynTask.cancel(true);。它将取消任务。你将在捕获块中调用它。