2013-03-20 132 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 2013-03-20 22:31:29

回答

0

你不能在主UI线程上调用fetchTwitterPublicTimeline()。在处理程序或计时器线程中将其延迟调用。

下面是一个简单的例子:

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

一个更好的做法是使用一个真正的Thread或者更好的AsyncTaskreference有一个非常有用的例子。

+0

非常感谢。作为一个新来java和Android的人,我会怎么做呢? – user1982365 2013-03-20 22:36:12

+0

按要求添加示例。 – 2013-03-20 22:42:18

0

您必须在AsyncTask上执行网络任务以避免阻塞UI线程。

无法启动活动 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 
}