#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 со всеми видео из этого списка воспроизведения. Я создал реализацию для просмотра списка видео, но я застрял в представлении списка воспроизведения.