2016-04-25 11 views
0

Ich habe ein Problem. Ich entwickle eine Android-App, und in meiner Aktivität verwende ich asyncTask. Ich rufe die Aufgabe von meinem onCreate und aktualisiere meine UI in onPostExecute. Ich habe ein listView und in der asyncTask führe ich HTTP-Anfrage aus, um Informationen vom Server zu erhalten. Aber mein Problem ist, dass ich manchmal während der Ausführung der Aktivität keine Ausgabe bekomme.AsyncTask onPost Execute läuft, aber DoInBackground ist nicht

Ich habe versucht, zu debuggen, und es scheint, dass ich einen Ausdruck von onPostExecute aber keine von doInBackground bekomme. Ich verwende Google Cloud Endpoints für HTTP-Anfragen, wenn dies relevant ist.

Bitte helfen.

Hier ist meine Klasse:

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

Könnte eine Möglichkeit sein, dass Sie eine Ausnahme bekommen. Fügen Sie einen 'catch block' hinzu, um dies zu überprüfen. –

Antwort

0

Vielleicht nur einfach einige IOException von myApiService geworfen wird. Sie fangen IOExceptions, aber drucken Sie kein Protokoll oder Stacktrace. Let's überprüfen Sie zuerst dieses.

catch (IOException e) { 

     } 

Wenn Sie Protokolle von OnPostExecute jedes Mal, so doInBackground genannt wurde sicher (Android tut das).

Auf jeden Fall sollten Sie alle diese

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(); 

     } 
    }); 

von OnPostExecute und tun Initialisierung in onCreate oder einem anderen Teil des Codes entfernen. In onPostExecute sollten Sie nur die benötigten UI-Elemente, notifyAdapters usw. aktualisieren. Die Initialisierung sollte früher erfolgen. Betrachten Sie diesen Ansatz.

+0

Vielen Dank Mann, meine API-Methode war manchmal eine Ausnahme werfen, behandelt es dank. –

Verwandte Themen