2013-03-20 2 views
-1

Я новичок в разработке Android. Вот мой код:Android-приложение, похоже, разбивается на setListAdapter

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 

public class MainActivity extends ListActivity { 


/** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,  this.fetchTwitterPublicTimeline())); 
    } 

    public ArrayList<String> fetchTwitterPublicTimeline() { 
     ArrayList<String> listItems = new ArrayList<String>(); 

     try { 
      URL twitter = new URL("http://twitter.com/statuses/public_timeline.json"); 
      URLConnection tc = twitter.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream())); 
      String line; 

      while ((line = in.readLine()) != null) { 
       JSONArray ja = new JSONArray(line); 
       for (int i = 0; i < ja.length(); i++) { 
        JSONObject jo = (JSONObject) ja.get(i); 
        listItems.add(jo.getString("text")); 
       } 
      } 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return listItems; 

    } 


} 

А вот мой acitivity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" > 
    <ListView android:id="@android:id/list" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 

LogCat ниже (или в this link):

03-21 09:16:15.530: E/AndroidRuntime(31912): ... 11 more 
03-21 09:16:33.590: E/AndroidRuntime(31991): FATAL EXCEPTION: main 
03-21 09:16:33.590: E/AndroidRuntime(31991): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.simplebrowser/com.example.simplebrowser.MainActivity}: android.os.NetworkOnMainThreadException 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.os.Looper.loop(Looper.java:137) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.app.ActivityThread.main(ActivityThread.java:5041) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at java.lang.reflect.Method.invokeNative(Native Method) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at java.lang.reflect.Method.invoke(Method.java:511) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at dalvik.system.NativeStart.main(Native Method) 
03-21 09:16:33.590: E/AndroidRuntime(31991): Caused by: android.os.NetworkOnMainThreadException 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpEngine.connect(HttpEngine.java:311) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at com.example.simplebrowser.MainActivity.fetchTwitterPublicTimeline(MainActivity.java:38) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at com.example.simplebrowser.MainActivity.onCreate(MainActivity.java:29) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.app.Activity.performCreate(Activity.java:5104) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
03-21 09:16:33.590: E/AndroidRuntime(31991): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
03-21 09:16:33.590: E/AndroidRuntime(31991): ... 11 more 

Я следовал a tutorial for this и Кажется, я не могу заставить его работать.

+0

посмотреть на [networkonmainthreadexception] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception). – Sajmon

ответ

0

Вы не можете назвать fetchTwitterPublicTimeline() в основном потоке пользовательского интерфейса. Назовите его задержкой, в обработчике или в потоке таймера.

Вот простой пример:

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     fetchTwitterPublicTimeline(); 
    } 
}, 400); 

Лучше практика будет использовать истинный Thread или же в AsyncTask лучше. reference имеет очень полезный пример.

+0

Отлично оценивайте это. Как кто-то новый для java и Android, как бы я это сделал? – user1982365

+0

Пример добавлен в соответствии с запросом. –

0

Чтобы избежать блокировки потока пользовательского интерфейса, вам необходимо выполнить сетевые задачи на AsyncTask.

Невозможно начать деятельность ComponentInfo {com.example.simplebrowser/com.example.simplebrowser.MainActivity}: android.os.NetworkOnMainThreadException

0

Причиненный: android.os.NetworkOnMainThreadException, сначала прочитал ваше исключение и искал решение, и если вы ничего не нашли, задайте вопрос. Самое простое решение для использования AsyncTask. которые имеют doInBackGround() и onPostExecute().

//This Run in background 
protected void doInBackground(String url){ 

//fetch objects 
//parse objects 

//it pass parsedObjects to onPostExecute method 
return parsedObjects; 
} 

//This run on current thread (Ui thread in this case) 
protected void onPostExecute(ParsedObjects o){ 
//Receives parsedObejct from doInBackground 
//update UI 
}