Search code examples
androidandroid-asynctask

Can't access "findViewById" in AsyncTask


I'm using an AsyncTask class to download data from a php file. After downloading, I want to put this data, into different TextViews, but I can't use the method findViewById.

The problem, is that I'm doing this by separate classes, and it all within a fragment.

This is my code:

public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{
private Context mContext;
[...]
public RecuperarComentarisFoto(Context context){
    this.mContext=context;
}
@Override
protected void onPreExecute() {
    [...]
}

@Override
protected String doInBackground(String... arg0) { 
    params.add(new BasicNameValuePair("pid", "1"));
    JSONObject json = jsonParser.makeHttpRequest(url_get_comentaris, "GET", params);
    JSONArray productObj;
    //HERE I RETRIEVE DATA FROM JSON. ITS WORKING OK.

    return null;
}

And where I've the problem:

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
    this.pDialog.dismiss();
    TextView comentariEditText = (TextView) findViewById(R.id.commentsMostrar);
}

I've tried this:

        TextView comentariEditText = (TextView) mContext.findViewById(R.id.commentsMostrar);

But isn't working too.

Note that I'm calling this AsyncTask from a Fragment. As you can see, I had to pass the context retrieved by getActivity() to the AsyncTask:

public class MyFragmentA extends Fragment {
Context cont;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false);

    cont=getActivity();
    new RecuperarComentarisFoto(cont).execute();
    return myFragmentView;
}


}

What should I do?

Thank you.


Solution

  • Pass your inflated view to the AsyncTask like this :

    public class RecuperarComentarisFoto extends AsyncTask<String, String, String>{
    private Context mContext;
    private View rootView;
    [...]
    public RecuperarComentarisFoto(Context context, View rootView){
        this.mContext=context;
        this.rootView=rootView;
    }
    @Override
    protected void onPreExecute() {
        [...]
    }
    
    @Override
    protected String doInBackground(String... arg0) { 
        params.add(new BasicNameValuePair("pid", "1"));
        JSONObject json = jsonParser.makeHttpRequest(url_get_comentaris, "GET", params);
        JSONArray productObj;
        //HERE I RETRIEVE DATA FROM JSON. ITS WORKING OK.
    
        return null;
    }
    @Override
    protected void onPostExecute(String result) {
        //super.onPostExecute(result);  <--GET RID OF THIS (it will screw up on 2.1 devices)
        this.pDialog.dismiss();
        // use rootview to findViewById
        TextView comentariEditText = (TextView) rootView.findViewById(R.id.commentsMostrar);
    }
    

    Then call like so,

    View myFragmentView = inflater.inflate(R.layout.fragment_a, container, false);
    
    cont=getActivity();
    new RecuperarComentarisFoto(cont, myFragmentView).execute();