Android getting result of AsyncTask in main Activity and add views to XML layout outside onCreate method

android, android-asynctask, android-layout

Solution

That exception probably comes from you instantiating a new `MediaActivity` instead of using the `Activity` instance from which you started the thread:

MediaActivity mainthread = new MediaActivity();//don't do this

Instead pass a reference of your `MediaActivity` in the `YoutubeConnect` task and use that reference to call `getResult`:

private MediaActivity activityRef;

public YoutubeConnect(MediaActivity activityRef) {
     this.activityRef = activityRef;
}

and in the `onPosteExecute` method:

@Override
protected void onPostExecute(String result) {
    try {
        activityRef.getResult(result); // you should have some ckecks to see if the activity is still available.
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Then to make a new `YoutubeConnect` task:

    YoutubeConnect youtubeRequest;
    ViewGroup media;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.media);
        youtubeRequest = new YoutubeConnect(this); 
        youtubeRequest.execute();
        media = (ViewGroup) this.findViewById(R.layout.media);
    }

Also, with this:

media = (ViewGroup) this.findViewById(R.layout.media);

You're searching for a `View` in the current layout by a layout file name and not an `id`. It should be like this:

media = (ViewGroup) this.findViewById(R.id.view_id_from_the_layout);

Problem

I'm trying to obtain a list of videos from `Youtube` to be displayed on my `Activity`. I've created the main activity `MediaActivity.java` with two methods, `onCreate` and `getResult` which is called from the `onPostExecute` method in the `AsyncTask` class. Here is the `MediaActivity` code: ``` public class MediaActivity extends Activity { YoutubeConnect youtubeRequest = new YoutubeConnect(); ViewGroup media; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); youtubeRequest.execute(); setContentView(R.layout.media); media = (ViewGroup) this.findViewById(R.layout.media); } public void getResult(String result) throws JSONException { JSONObject jsonObj = new JSONObject(result); JSONObject jsonObj2 = jsonObj.getJSONObject("feed"); JSONArray the_json_array = jsonObj2.getJSONArray("entry"); int size = the_json_array.length(); for (int i = 0; i < size; i++) { //get all infos [...] LinearLayout main = new LinearLayout(this); main.setOrientation(0); main.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); //thumb WebView thumb = new WebView(this); thumb.loadUrl(video_thumb); main.addView(thumb); LinearLayout right = new LinearLayout(this); right.setOrientation(1); right.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); //title TextView title = new TextView(this); title.setText(video_title); right.addView(title); //description TextView description = new TextView(this); description.setText(video_description.substring(100)+"..."); right.addView(description); //views TextView views = new TextView(this); views.setText("Views: "+video_views); right.addView(views); main.addView(right); this.media.addView(main); } } } ``` This is my custom `AsyncTask` class code: ``` public class YoutubeConnect extends AsyncTask<String, String, String> { public YoutubeConnect() { } @Override protected String doInBackground(String... params) { try { String APIurl = "https://gdata.youtube.com/feeds/api/videos?author=author&alt=json"; DefaultHttpClient httpClient = new DefaultHttpClient(); HttpGet request = new HttpGet(APIurl); HttpResponse response = httpClient.execute(request); BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); StringBuilder builder = new StringBuilder(); for (String line = null; (line = reader.readLine()) != null;) { builder.append(line).append("\n"); } return builder.toString(); } catch (Exception e) { return null; } } @Override protected void onPostExecute(String result) { super.onPostExecute(result); MediaActivity mainthread = new MediaActivity(); try { mainthread.getResult(result); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ``` This is the log: ``` 05-17 11:01:26.383: E/AndroidRuntime(2687): FATAL EXCEPTION: main 05-17 11:01:26.383: E/AndroidRuntime(2687): java.lang.NullPointerException 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.content.ContextWrapper.getResources(ContextWrapper.java:81) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.view.View.<init>(View.java:2696) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.view.ViewGroup.<init>(ViewGroup.java:374) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.widget.LinearLayout.<init>(LinearLayout.java:166) 05-17 11:01:26.383: E/AndroidRuntime(2687): at wachipi.palio.MediaActivity.getResult(MediaActivity.java:47) 05-17 11:01:26.383: E/AndroidRuntime(2687): at wachipi.palio.YoutubeConnect.onPostExecute(YoutubeConnect.java:41) 05-17 11:01:26.383: E/AndroidRuntime(2687): at wachipi.palio.YoutubeConnect.onPostExecute(YoutubeConnect.java:1) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.AsyncTask.finish(AsyncTask.java:602) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.AsyncTask.access$600(AsyncTask.java:156) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.Handler.dispatchMessage(Handler.java:99) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.os.Looper.loop(Looper.java:137) 05-17 11:01:26.383: E/AndroidRuntime(2687): at android.app.ActivityThread.main(ActivityThread.java:4424) 05-17 11:01:26.383: E/AndroidRuntime(2687): at java.lang.reflect.Method.invokeNative(Native Method) 05-17 11:01:26.383: E/AndroidRuntime(2687): at java.lang.reflect.Method.invoke(Method.java:511) 05-17 11:01:26.383: E/AndroidRuntime(2687): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 05-17 11:01:26.383: E/AndroidRuntime(2687): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 05-17 11:01:26.383: E/AndroidRuntime(2687): at dalvik.system.NativeStart.main(Native Method) ``` Before various attempt the `setContenView` and `ViewGroup` lines were inside the `getResult` method, but it gave me other errors. I've also tried to use the debugger but it gives me error `"source not found"`, I think something is missing in my installation. I really can't understand why it throws this error and can't find anything about it.

Original source