2016-04-25 42 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方法有时会抛出一个异常,处理它谢谢。 –

相关问题