2016-04-25 87 views
0

我遇到問題。我正在開發一個Android應用程序,並在我的活動中使用asyncTask。我從我的onCreate調用任務並在onPostExecute中更新我的UI。我有一個listView和在asyncTask我正在執行Http請求從服務器獲取信息。但我的問題是,有時在運行活動時我沒有得到任何輸出。AsyncTask onPost Execute正在運行,但doInBackground不是

我試過調試,看來我從onPostExecute獲得一個打印,但沒有從doInBackground獲取打印。如果相關,我也在使用Google Cloud Endpoints進行Http請求。

請幫忙。

這裏是我的類:

public class ILiked extends CustomFragment { 
public ArrayList<User> ilikedList = new ArrayList<>(); 
ListView userList; 
MyAdapter adapter; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    final View v = inflater.inflate(R.layout.fragment_iliked, null); 
    ILikedAsyncTask task = new ILikedAsyncTask(); 
    task.execute(new Pair<>(getShared().getString("username", ""), v)); 
    return v; 
} 

public SharedPreferences getShared() { 
    SharedPreferences shared; 
    if (Login.sharedPreferences != null) { 
     shared = this.getActivity().getSharedPreferences(Login.MyPreferences, Context.MODE_PRIVATE); 
    } else { 
     shared = this.getActivity().getSharedPreferences(Signup.MyPreferences, Context.MODE_PRIVATE); 
    } 
    return shared; 
} 

public class ILikedAsyncTask extends AsyncTask<Pair<String, View>, Void, ArrayList<User>> { 
    private UserApi myApiService = null; 
    View context; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     System.out.println("I AM IN PRE EXECUTE"); 
    } 

    @Override 
    protected ArrayList<User> doInBackground(Pair<String, View>... params) { 
     context = params[0].second; 
     if (myApiService == null) { 
      UserApi.Builder builder = new UserApi.Builder(AndroidHttp.newCompatibleTransport(), 
        new AndroidJsonFactory(), null) 

        .setRootUrl("MYURL") 
        .setGoogleClientRequestInitializer(new GoogleClientRequestInitializer() { 
         @Override 
         public void initialize(AbstractGoogleClientRequest<?> abstractGoogleClientRequest) throws IOException { 
          abstractGoogleClientRequest.setDisableGZipContent(true); 
         } 
        }); 

      myApiService = builder.build(); 
     } 

     ArrayList<User> list = new ArrayList<>(); 
     try { 
      String username = params[0].first; 
      UserCollection users = myApiService.getUsersILiked(username).execute(); 
      System.out.println("CONTENT" + users.getItems().toString()); 
      if (users != null) { 
       List<User> userList = users.getItems(); 
       list.addAll(userList); 
      } 

     } catch (IOException e) { 

     } 
     return list; 

    } 


    @Override 
    protected void onPostExecute(final ArrayList<User> result) { 
     super.onPostExecute(result); 
     userList = (ListView) context.findViewById(R.id.iliked_list); 

     adapter = new MyAdapter(context.getContext(), result); 
     userList.setAdapter(adapter); 
     //System.out.println("List Content: "+result.get(0)); 
     userList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Profile fr = new Profile(); 
       FragmentManager fm = getFragmentManager(); 
       FragmentTransaction ft = fm.beginTransaction(); 
       Bundle args = new Bundle(); 
       args.putString("username", result.get(position).getUsername()); 
       fr.setArguments(args); 
       ft.replace(R.id.content_frame, fr); 
       ft.commit(); 

      } 
     }); 
     System.out.println("DID THE ASYNC"); 
    } 
} 

}

+0

可能是你有可能得到例外。在「catch塊」中添加一個日誌來檢查。 –

回答

0

也許只是簡單的一些IOException異常myApiService拋出。 你抓IOExceptions但不打印任何日誌或堆棧跟蹤。我們先 檢查這一個。

catch (IOException e) { 

     } 

如果你每次都擁有原木onPostExecute,所以doInBackground被稱爲 肯定(Android爲這一點)。

反正你應該刪除所有這一切

userList = (ListView) context.findViewById(R.id.iliked_list); 

    adapter = new MyAdapter(context.getContext(), result); 
    userList.setAdapter(adapter); 
    //System.out.println("List Content: "+result.get(0)); 
    userList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Profile fr = new Profile(); 
      FragmentManager fm = getFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      Bundle args = new Bundle(); 
      args.putString("username", result.get(position).getUsername()); 
      fr.setArguments(args); 
      ft.replace(R.id.content_frame, fr); 
      ft.commit(); 

     } 
    }); 

從onPostExecute和的onCreate或代碼的另一部分做初始化。在onPostExecute中,您只應更新所需的UI元素,notifyAdapter等。初始化應儘早完成。考慮這種方法。

+0

謝謝很多人,我的api方法有時會拋出一個異常,處理它謝謝。 –

相關問題