2015-06-29 59 views
0

這是我的Asyntask代碼,它沒有觸發onPostExecute()任何人有任何想法,爲什麼這可能會發生?Asyntask不會執行onPostExecute()

編輯:Asyntask被稱爲這樣

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     FacebookSdk.sdkInitialize(getApplicationContext()); 
     callbackManager = CallbackManager.Factory.create(); 

     setContentView(R.layout.activity_main); 
     . 
     . 
     textView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(getApplicationContext(), SignUp.class); 
       startActivity(intent); 
      } 
     }); 
     textView2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent = new Intent(getApplicationContext(), Feedback.class); 
       startActivity(intent); 
      } 
     }); 


     fbLoginButton = (LoginButton) findViewById(R.id.login_button); 
     fbLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 
       token=loginResult.getAccessToken().getToken().toString(); 

       Log.v("tag", "Token:\n" + token); 
       try { 
        get_profile(); 
       }catch (Exception ex) { 
        String error = ex.getMessage(); 
       } 


      } 

      @Override 
      public void onCancel() { 
       Toast.makeText(MainActivity.this, "Login cancelled by user!", Toast.LENGTH_LONG).show(); 
       System.out.println("Facebook Login failed!!"); 

      } 

      @Override 
      public void onError(FacebookException e) { 
       Toast.makeText(MainActivity.this, "Login unsuccessful!", Toast.LENGTH_LONG).show(); 
       System.out.println("Facebook Login failed!!"); 
      } 
     }); 
    } 

get_profile();方法是這樣

//Method to get profile details 
    public void get_profile() throws UnsupportedEncodingException { 
     try { 
      // Calling async task to get json 
      new FetchOperation().execute(); 

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

這是主類中定義過

//Asynctask to get Getting fb profile details 
    private class FetchOperation extends AsyncTask<Void, Void, String> { 
     String fb_token; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Get user defined values 
      fb_token = token; 


     } 

     @Override 
     protected String doInBackground(Void... params) { 
      String response = ""; 
      String Urls = "https://graph.facebook.com/me?access_token="; 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpGet httpget = new HttpGet(Urls +token); 
      HttpEntity httpEntity = null; 
      HttpResponse httpResponse = null; 
      try { 
       httpResponse = httpclient.execute(httpget); 

      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
       Log.v("Response", "Hi From e1 : " + e.toString()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      try { 
       httpEntity = httpResponse.getEntity(); 
       response = EntityUtils.toString(httpEntity); 
       Log.v("Response", "Hi From 2 : "+response.toString()); 
       return response; 
      } catch (IOException e) { 
       e.printStackTrace(); 
       Log.v("Response", "Hi From e2 : " + e.toString()); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String jsonStr) { 
      super.onPostExecute(jsonStr); 
      Log.v("tag", "Result:" + jsonStr); 
      if (jsonStr != null) { 
       try{ 
        JSONObject jsonObj = new JSONObject(jsonStr); 
        String email = jsonObj.getString("email"); 
        String firstName = jsonObj.getString("first_name"); 
        String lastName = jsonObj.getString("last_name"); 
        String gender = jsonObj.getString("gender"); 
        String country = jsonObj.getString("locale"); 
        id = jsonObj.getString("id"); 
        user = firstName.concat(" "); 
        user = user.concat(lastName); 
        image = "http://graph.facebook.com/" + id + "/picture?type=large"; 
        Log.v("Fb name", "Bla bla Name : " + user); 
        new UploadOperation().execute(); 

       } 
       catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      else { 
       Log.e("ServiceHandler", "Couldn't get any data from the url"); 
      } 
     } 
    } 

這是logcat的最後一行

06-29 14:30:49.927 2091-2091/com.example.kmi_dev.fbloginsample V/tag﹕ Token: 
    CA****************************************************************xr 
06-29 14:30:50.697 2091-2135/com.example.kmi_dev.fbloginsample V/Response﹕ Hi From 2 : {"id":"910***********6","first_name":"Shivanshu","gender":"male","last_name":"Verma","link":"https:\/\/www.facebook.com\/app_scoped_user_id\/910***********6\/","locale":"en_GB","name":"Shivanshu Verma","timezone":5.5,"updated_time":"2015-06-22T04:17:39+0000","verified":true} 
06-29 14:31:23.827 2091-2098/com.example.kmi_dev.fbloginsample W/art﹕ Suspending all threads took: 10ms 

我打算啓動另一個asyntask,然後將這個asyntask獲取的數據保存到數據庫中。

+0

你如何調用'asynctask'?你能發佈那部分代碼嗎? –

+0

@AbhishekV它已經有'new UploadOperation()。execute();'但問題是與當前的Asyntask。這個不會觸發'onPostExecute()'方法 –

+0

N ..我想知道你是如何調用'FetchOperation' asynctask的。它是從UI線程調用的權利? –

回答

1

進行這些改變,它會工作 -

  1. private class FetchOperation extends AsyncTask<Void, Void, String> 變化 - private class FetchOperation extends AsyncTask<Void, String, String>,因爲,你試圖返回字符串。
  2. response = EntityUtils.toString(httpEntity); 更改爲 - response = EntityUtils.toString(httpEntity).toString(); 在下一行中,您已經完成了它。
  3. 在doInBackground方法的盡頭在那裏return null; 變化 - return response;

4.No需要調用在onPostExecute()

5.Inside onPostExecute(超)檢查jsonStr爲空或不是並做任何你想做的事情,如果null和如果包含json數據。

-1

您的JSONObject不包含JSONString「電子郵件」,所以它在行

String email = jsonObj.getString("email"); 

摔倒並直行到catch塊。

+0

'onPostExecute()'方法永遠不會被觸發,我甚至不會打印這個Log.v(「tag」,「Result:」+ jsonStr);'一個沒有錯誤什麼。 –