在Android的主要活动取得的AsyncTask的结果,并onCreate方法之外添加视图XML布局 [英] Android getting result of AsyncTask in main Activity and add views to XML layout outside onCreate method

查看:179
本文介绍了在Android的主要活动取得的AsyncTask的结果,并onCreate方法之外添加视图XML布局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从的Youtube 获取视频列表将显示在我的活动
我创建的主要活动 MediaActivity.java 有两种方法,的onCreate 的getResult 这是从的AsyncTask 类的<​​code> onPostExecute 方法调用。
这里是 MediaActivity code:

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


     }      

}

这是我的自定义的AsyncTask 类code:

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




 }

这是日志:

 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)

各种尝试的 setContenView 的ViewGroup 线在里面之前的的getResult 方法,但它给了我其他错误。我也试着使用调试器,但它给了我错误源未找到,我认为有些事情在我安装失踪。
我真的不明白为什么它会抛出这个错误并不能找到任何关于它。

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.

推荐答案

这是例外,可能是来自于你实例化一个新的 MediaActivity 而不是使用活动从中启动线程的实例:

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

而不是通过你的 MediaActivity YoutubeConnect 任务,并使用该引用调用<$ C $的参考C>的getResult :

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;
}

,并在 onPosteExecute 方法:

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

然后作出新的 YoutubeConnect 任务:

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

您是通过布局文件名搜索一个查看在当前布局,而不是 ID 。它应该是这样的:

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

这篇关于在Android的主要活动取得的AsyncTask的结果,并onCreate方法之外添加视图XML布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆