2

Youtubeに表示する動画のリストを取得しようとしていActivityます。MediaActivity.java2つのメソッドを使用してメインアクティビティをonCreate作成しました。これは、クラスのメソッドgetResultから呼び出されます。コードは次のとおりです。onPostExecuteAsyncTaskMediaActivity

    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クラスコードです:

 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)

さまざまな試行の前に、setContenViewandViewGroup行はgetResultメソッド内にありましたが、他のエラーが発生しました。デバッガーも使用しようとしましたが、エラーが発生"source not found"します。インストールに何かが欠けていると思います。なぜこのエラーが発生するのか理解できず、何も見つかりません。

4

1 に答える 1

7

この例外は、スレッドを開始しMediaActivityたインスタンスを使用する代わりに、新しいインスタンスをインスタンス化することで発生する可能性があります。Activity

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

代わりMediaActivityに、YoutubeConnectタスクで自分の参照を渡し、その参照を使用して呼び出します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);
    }

また、これで:

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

View現在のレイアウトで、ではなくレイアウトファイル名でを検索していますid。次のようになります。

media = (ViewGroup) this.findViewById(R.id.view_id_from_the_layout);
于 2012-05-17T09:44:19.463 に答える