Ошибка: системная служба недоступна для активности до oncreate()
Я пытаюсь разработать RSS Reader
приложение. Но я получаю ошибку, полный след стека приведен ниже.
01-14 21:18:54.262: E/AndroidRuntime(2541): FATAL EXCEPTION: main
01-14 21:18:54.262: E/AndroidRuntime(2541): java.lang.IllegalStateException: System services not available to Activities before onCreate()
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.app.Activity.getSystemService(Activity.java:4463)
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:153)
01-14 21:18:54.262: E/AndroidRuntime(2541): at com.example.simplerssreader.SimpleRssReaderActivity.setData(SimpleRssReaderActivity.java:92)
01-14 21:18:54.262: E/AndroidRuntime(2541): at com.example.simplerssreader.asyntask.AsynTaskRequest.onPostExecute(AsynTaskRequest.java:98)
01-14 21:18:54.262: E/AndroidRuntime(2541): at com.example.simplerssreader.asyntask.AsynTaskRequest.onPostExecute(AsynTaskRequest.java:1)
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.os.AsyncTask.finish(AsyncTask.java:631)
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.os.Handler.dispatchMessage(Handler.java:99)
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.os.Looper.loop(Looper.java:137)
01-14 21:18:54.262: E/AndroidRuntime(2541): at android.app.ActivityThread.main(ActivityThread.java:5041)
01-14 21:18:54.262: E/AndroidRuntime(2541): at java.lang.reflect.Method.invokeNative(Native Method)
01-14 21:18:54.262: E/AndroidRuntime(2541): at java.lang.reflect.Method.invoke(Method.java:511)
01-14 21:18:54.262: E/AndroidRuntime(2541): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-14 21:18:54.262: E/AndroidRuntime(2541): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-14 21:18:54.262: E/AndroidRuntime(2541): at dalvik.system.NativeStart.main(Native Method)
Вот моя основная деятельность
public class SimpleRssReaderActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple_rss_reader);
new AsynTaskRequest().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.simple_rss_reader, menu);
return true;
}
public void setData(){
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, AsynTaskRequest.headLines);
setListAdapter(adapter);
}
}
Код класса AsynTask
public class AsynTaskRequest extends AsyncTask<Void, Void, String>{
public static List<String> headLines;
public static List<String> links;
SimpleRssReaderActivity smrssreader;
@Override
protected String doInBackground(Void... params) {
try {
headLines = new ArrayList<String>();
links = new ArrayList<String>();
URL url = new URL("http://gcuf.edu.pk/feed/");
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp = factory.newPullParser();
// We will get the XML from an input stream
xpp.setInput(getInputStream(url), "UTF_8");
boolean insideItem = false;
//Retruns the type of current event: START_TAG, END_TAG, etc..
int eventType= xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equalsIgnoreCase("item")) {
insideItem = true;
}else if (xpp.getName().equalsIgnoreCase("title")) {
if(insideItem){
headLines.add(xpp.nextText()); // Extract the headline
}
}else if (xpp.getName().equalsIgnoreCase("link")) {
if (insideItem) {
links.add(xpp.nextText()); // Extract the link of article
}
}
}else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")) {
insideItem = false;
}
eventType = xpp.next();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (XmlPullParserException e){
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return null;
}
public InputStream getInputStream (URL url){
try {
return url.openConnection().getInputStream();
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
smrssreader = new SimpleRssReaderActivity();
smrssreader.setData();
}
}
1 ответ
Ваш onPostExecute()
неправильно. НИКОГДА не создавайте экземпляр действия самостоятельно, не говоря уже о конструкторе. Вместо этого ваш AsynTaskRequest
Нужно иметь какие-то средства общения обратно к своей деятельности. Также необходимо учитывать тот факт, что активность может измениться во время этой работы из-за того, что пользователь поворачивает экран или из-за какого-либо другого изменения конфигурации.
Вы могли бы:
Используйте шину событий (
LocalBroadcastManager
, Отто, EventBus Greenrobot и т. Д.), И естьonPostExecute()
вызвать событие, которое будет обнаружено после завершения работы, илиПереместить
AsyncTask
быть внутренним классом сохраненного фрагмента, поэтому задача работает с фрагментом вonPostExecute()
и фрагмент знает правильную активность, чтобы поговорить, или
Существуют и другие паттерны, но для начала есть два.