2015-10-06 42 views
3

因此对于一个班级,我必须使用RSS阅读器程序。代码基本上给了我们,但我们必须把它放到android中。该代码在Java中工作,但是当我尝试在Android中运行它时修改它以便它将更改TextViews文本时,它会进行编译,但是在运行时,我收到了一堆我不明白的错误。这是我的代码。我认为这与我使用setText()或TextView对象有关。Java程序有效,但不会在Android Studio中运行

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class MainActivity extends AppCompatActivity { 
    TextView rssFeed; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     rssFeed = (TextView)findViewById(R.id.txtFeed); 
     rssFeed.setText(readRSS("http://rss.cnn.com/rss/edition.rss")); 
    } 

    public static String readRSS(String urlAddress) 
    { 
     try{ 
      URL rssUrl = new URL(urlAddress); 
      BufferedReader in = new BufferedReader(new InputStreamReader(rssUrl.openStream())); 
      String sourceCode = ""; 
      String line; 
      while ((line = in.readLine()) != null) { 
       int titleEndIndex = 0; 
       int titleStartIndex = 0; 
       while (titleStartIndex >= 0) { 
        titleStartIndex = line.indexOf("<title>", titleEndIndex); 
        if (titleStartIndex >= 0) { 
         titleEndIndex = line.indexOf("</title>", titleStartIndex); 
         sourceCode += line.substring(titleStartIndex + "<title>".length(), titleEndIndex) + "\n"; 
        } 
       } 
      } 
      in.close(); 
      return sourceCode; 
     } 
     catch (MalformedURLException ue) { 
      System.out.print("Malformed URL"); 
     } 
     catch (IOException ioe) 
     { 
      System.out.println("Something went wrong reading the contents"); 
     } 
     return "Program Failed"; 
    } 

的XML是

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <TextView android:text="" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/txtFeed" /> 
</RelativeLayout> 

的logcat的是

10-05 23:05:49.839 2087-2087/com.example.andrewsaarima.rssreader I/art: Not late-enabling -Xcheck:jni (already on) 
10-05 23:05:49.840 2087-2087/com.example.andrewsaarima.rssreader I/art: Late-enabling JIT 
10-05 23:05:49.843 2087-2087/com.example.andrewsaarima.rssreader I/art: JIT created with code_cache_capacity=2MB compile_threshold=1000 
10-05 23:05:49.996 2087-2087/com.example.andrewsaarima.rssreader W/System: ClassLoader referenced unknown path: /data/app/com.example.andrewsaarima.rssreader-2/lib/x86 
10-05 23:05:50.220 2087-2087/com.example.andrewsaarima.rssreader D/AndroidRuntime: Shutting down VM 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime: FATAL EXCEPTION: main 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime: Process: com.example.andrewsaarima.rssreader, PID: 2087 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.andrewsaarima.rssreader/com.example.andrewsaarima.rssreader.MainActivity}: android.os.NetworkOnMainThreadException 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread.-wrap11(ActivityThread.java) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:148) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime: Caused by: android.os.NetworkOnMainThreadException 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at java.net.InetAddress.lookupHostByName(InetAddress.java:431) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at java.net.InetAddress.getAllByName(InetAddress.java:215) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.Network$1.resolveInetAddresses(Network.java:29) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:188) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:157) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:100) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:357) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.http.HttpEngine.nextConnection(HttpEngine.java:340) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:330) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:248) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:433) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:231) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at java.net.URL.openStream(URL.java:470) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.example.andrewsaarima.rssreader.MainActivity.readRSS(MainActivity.java:28) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.example.andrewsaarima.rssreader.MainActivity.onCreate(MainActivity.java:21) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.Activity.performCreate(Activity.java:6237) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread.-wrap11(ActivityThread.java)  
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102)  
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:148)  
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5417)  
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method)  
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
10-05 23:05:50.487 2087-2087/com.example.andrewsaarima.rssreader E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
10-05 23:05:53.950 2087-2094/com.example.andrewsaarima.rssreader W/art: Suspending all threads took: 25.938ms 
10-05 23:05:55.994 2087-2087/? I/Process: Sending signal. PID: 2087 SIG: 9 
+4

PLZ显示logcat的.... –

+2

'NetworkOnMainThreadException' - 谷歌认为。 –

回答

4

你应该为了呼吁RSS提要URL在Android上使用AsyncTask。其实施非常简单。你应该做的第一件事是从here读取AsyncTask如果你不知道它。然后根据AsyncTask像执行代码:

private class RSSTask extends AsyncTask<String, Void, String> 
    { 
     ProgressDialog pd; 

     //onPreExecute() will be called before entering into background thread 
     @Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 

      pd = ProgressDialog.show(context, "RSS Feed", "Fetching Rss Feed Please Wait"); 

     } 

     //this is background thread called after onPreExecute() 
     @Override 
     protected String doInBackground(String... params) 
     { 
      String rssResponse = readRSS(params[0]) 

      return rssResponse; 
     } 

     //called after doInBackground() finished 
     @Override 
     protected void onPostExecute(String result) 
     { 
      super.onPostExecute(result); 

      pd.dismiss(); 

      rssFeed.setText(result);// here result will be returning string from doInBackground() 
     } 
    } 

拷贝整个AsyncTask类的MainActivity然后

替换:

rssFeed.setText(readRSS("http://rss.cnn.com/rss/edition.rss"));

随着

RSSTask rssT = new RSSTask(); rssT.execute("http://rss.cnn.com/rss/edition.rss");

希望你会得到所需的输出。

+0

是的,经过许多修补之后,这有很大的帮助,尽管我认为它没有工作。我不得不最终使用.get()方法来查看所需的输出。非常感谢你指导我朝着正确的方向前进。 rssT.execute(“http://rss.cnn.com/rss/edition.rss”).get(); –

+0

@OptimusOmega我很高兴它帮助你 –

2

NetworkOnMainThreadException意味着你不应该执行的应用程序的主线程Web请求。而是使用Loaders(这是最好比AsyncTask,读here为什么)或一些库网络(例如VolleyRetrofit)。

后你会得到和解析响应您可以通过导致StringTextView

+0

@OptimusOmega是否有帮助? –

+0

很高兴知道那是在那里,但教授显然希望我们使用AsyncTask,谢谢,不过,我会为我的下一个项目研究装载机。 –

+0

@OptimusOmega无论如何,你不应该在应用程序主线程中执行web请求。如果你需要它,使用'AsyncTask',但在'doInBackground'中发出web请求。 –

相关问题