2016-04-25 3 views
0

У меня проблема. Я разрабатываю приложение для Android, и в своей работе я использую asyncTask. Я вызываю задачу из моего onCreate и обновляю свой интерфейс в onPostExecute. У меня есть 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 block', чтобы проверить это. –

ответ

0

Может быть, просто в какой-то IOException выбрасывается myApiService. Вы поймаете IOExceptions, но не печатайте ни один журнал или стек. Let's проверьте сначала этот.

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 вы должны обновлять необходимые элементы пользовательского интерфейса, notifyAdapters и т. Д. Инициализация должна выполняться ранее. Рассмотрим этот подход.

+0

Спасибо, много человек, мой метод api иногда бросал исключение, обрабатывал его благодаря. –

Смежные вопросы