Ошибка при использовании приложения на устройствах 4.0 Исключение Json

#java #android

#java #Android

Вопрос:

Я получаю странную ошибку, когда я запускаю свое приложение на устройствах 4.0 , я влюбился, когда я просматриваю свои видео, когда я использую его на 2.3, все в порядке.

Это поиск / проигрыватель Youtube.

Вот моя ошибка:

  07-01 17:30:21.324: E/AndroidRuntime(23429): FATAL EXCEPTION: main
07-01 17:30:21.324: E/AndroidRuntime(23429): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.searcher1/com.example.searcher1.JsonParsingActivity}: java.lang.NullPointerException
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2225)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.app.ActivityThread.access$600(ActivityThread.java:151)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1301)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.os.Looper.loop(Looper.java:153)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.app.ActivityThread.main(ActivityThread.java:5070)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at java.lang.reflect.Method.invokeNative(Native Method)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at java.lang.reflect.Method.invoke(Method.java:511)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at dalvik.system.NativeStart.main(Native Method)
07-01 17:30:21.324: E/AndroidRuntime(23429): Caused by: java.lang.NullPointerException
07-01 17:30:21.324: E/AndroidRuntime(23429):    at com.example.searcher1.JsonParsingActivity.onCreate(JsonParsingActivity.java:78)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.app.Activity.performCreate(Activity.java:5207)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)
07-01 17:30:21.324: E/AndroidRuntime(23429):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
07-01 17:30:21.324: E/AndroidRuntime(23429):    ... 11 more
  

Ошибка его при:

 for (Video l : lst)
            {
            alrts.add(l);   
            }
  

Полный код:

 public class JsonParsingActivity extends Activity  {


        //ListView that will hold our items references back to main.xml
        ListView lstTest;
        //Array Adapter that will hold our ArrayList and display the items on the ListView
        AlertsAdapter arrayAdapter;

        //List that will  host our items and allow us to modify that array adapter
        ArrayList<Video> alrts=null;
        private TextView button;
        private EditText resu<
        final Context context = this;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.search_tab);

            String username = null;      
            Bundle extras = getIntent().getExtras();

            if(extras != null)
            {
                username = extras.getString("searchterm");
            }

           //Initialize ListView
            lstTest= (ListView)findViewById(R.id.list);
            button = (TextView) findViewById(R.id.frontImage);
            result = (EditText) findViewById(R.id.editTextResult);


          //Initialize our ArrayList
            alrts = new ArrayList<Video>();

           //Initialize our array adapter notice how it references the listitems.xml layout
            arrayAdapter = new AlertsAdapter(JsonParsingActivity.this, R.layout.youtube_list_item,alrts);

          //Set the above adapter as the adapter of choice for our list
            lstTest.setAdapter(arrayAdapter);

            List<Video> lst = null;
            try {
                lst = new YouTube().getVideos(username);
            } catch (YouTubeException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }





            for (Video l : lst)
            {
            alrts.add(l);   
            }





            arrayAdapter.notifyDataSetChanged();



     // listening to single list item on click
        lstTest.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(AdapterView<?> parent, View view,
              int position, long id) {

              String s = Video.getId(position);
              Intent intent = new Intent(Intent.ACTION_VIEW, 
                      Uri.parse("vnd.youtube://" 
                      s ));
              startActivity(intent); 




}
        });

        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {


                 String Data = result.getText().toString();

                 Intent i = new Intent(context,JsonParsingActivity.class);
                 Bundle extras = new Bundle();
                 extras.putString("searchterm", Data);
                 i.putExtras(extras);
                 startActivityForResult(i, 1);



}
});    



        }

        @Override
        public void onBackPressed() {
            // TODO Auto-generated method stub
            super.onBackPressed();

            Intent i = new Intent(context,SearchActivity.class);
            this.finish();
            startActivityForResult(i, 1);

        }

        @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
        }





    }
  

Комментарии:

1. Пожалуйста, опубликуйте всю ошибку logcat.

2. Вы получаете исключение NPE Или YouTubeException?

3. Я обновил свой пост, вы можете увидеть там полный logcat. Я получаю NPE.

4. Какая инструкция у вас есть здесь JsonParsingActivity.java:78?

5. Так нигде не было исключения YoutubeException?? Существуют ли необработанные исключения в YouTube().getVideos(String) методе??

Ответ №1:

Я узнал, как это исправить:

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
  

Мне пришлось добавить это из-за исключения Json.

Комментарии:

1. Это наихудшее возможное решение, которое вы могли бы сделать … серьезно. StrictMode и ThreadPolicy нет ничего , о чем вы когда-либо должны думать, чтобы изменить. Помимо того факта, что ваша «проблема» основана на NetworkOnUIThreadException , а не на NullPointer

2. Почему худшее? Работает, и нет ошибки или чего-либо еще, нет исключения и т.д., Да, это сетевое исключение, ну и что? Это работает, и это простая реализация, нет необходимости в асинхронной задаче. Если у вас есть лучшее решение, вы должны опубликовать его, а не делать глупые комментарии, когда у вас нет реального решения.

3. Вы должны понимать тот факт, что это исключение предназначено для того, чтобы помешать разработчикам делать то, что вы делаете. Рассмотрим такую ситуацию: у вашего пользователя медленное соединение, выполнение вашего сетевого запроса занимает не менее 20 секунд. За эти 20 секунд вы получаете около 3 диалоговых окон, предупреждающих пользователя о том, что ваше приложение больше не отвечает. Ваше решение не является решением. Вы собираетесь создать плохое приложение для пользователей. Полно черных экранов, предупреждающих диалоговых окон и т.д. Мое «решение» для вас: выполняйте ваши запросы в AsyncTask и прочитайте это: developer.android.com/training/articles/perf-anr.html

4. Хорошо, я проверю ссылку и дам вам знать, но пока у меня не было проблем с этим «решением», как вы говорите, если таковое возникнет, я попробую что-то новое, но сначала я посмотрю на вашу идею.

5. Кроме того, я хочу спросить вас кое о чем, есть ли у вас какие-либо рекомендации или какие-либо советы, чтобы помочь мне с проблемой? Мне нужно проанализировать в listview все списки воспроизведения, содержащие имя пользователя, и, щелкнув строку списка воспроизведения, открыть новый listview со всеми видео из этого списка воспроизведения. Я создал реализацию для просмотра списка видео, но я застрял в представлении списка воспроизведения.