2013-03-12 258 views
-1

我最近开始android开发,面对不合适应用程序的错误已停止。该应用程序非常简单,它可以在按下按钮时从twitter获取提要并将其显示在文本框中。当多次按下按钮时会发生错误。这里是我的代码:当按钮按下两次时,应用程序停止android

package com.example.newsfeed; 

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

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

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class NewsFeed extends Activity { 

    AsyncTask<Void, Void, Void> mTask; 
    String jsonString; 
    String url = "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=50cent&count=3"; 
    Button b; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_news_feed); 
     b = (Button) findViewById(R.id.getFeedBtn); 
     final TextView tv = (TextView) findViewById(R.id.newsfeedEdit); 

     mTask = new AsyncTask<Void, Void, Void>() { 

      @Override 
      protected Void doInBackground(Void... arg0) { 
       // TODO Auto-generated method stub 
       try { 
        jsonString = getJsonFromServer(url); 
       } catch(IOException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 
       try { 
        JSONArray jArray = new JSONArray(jsonString); 
        String text=""; 


        for(int i=0; i<jArray.length(); i++) { 
         JSONObject e = (JSONObject) jArray.getJSONObject(i); 

         JSONObject f = (JSONObject) jArray.getJSONObject(i).get("user"); 

         text = text + "User : "+f.getString("name")+"\n"; 

         text = text + "ID : "+e.getString("id")+"\n"; 
         text = text + "SOURCE: "+e.getString("source")+"\n"; 
         text = text + "TEXT : "+e.getString("text")+"\n"; 
        } 
        tv.setText(text); 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

     }; 

     b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       mTask.execute(); 
      } 
     }); 
    } 

    public static String getJsonFromServer(String url) throws IOException { 
     BufferedReader inputStream = null; 

     URL jsonUrl = new URL(url); 
     URLConnection dc = jsonUrl.openConnection(); 

     dc.setConnectTimeout(5000); 
     dc.setReadTimeout(5000); 

     inputStream = new BufferedReader(new InputStreamReader(
       dc.getInputStream())); 

     String jsonResult = inputStream.readLine(); 
     return jsonResult; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_news_feed, menu); 
     return true; 
    } 

} 

这里是我的logcat:

03-12 11:01:17.172: E/AndroidRuntime(10297): FATAL EXCEPTION: main 
03-12 11:01:17.172: E/AndroidRuntime(10297): java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:578) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at android.os.AsyncTask.execute(AsyncTask.java:534) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at com.example.newsfeed.NewsFeed$2.onClick(NewsFeed.java:83) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at android.view.View.performClick(View.java:4202) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at android.view.View$PerformClick.run(View.java:17340) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at android.os.Handler.handleCallback(Handler.java:725) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at android.os.Looper.loop(Looper.java:137) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at android.app.ActivityThread.main(ActivityThread.java:5039) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at java.lang.reflect.Method.invokeNative(Native Method) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at java.lang.reflect.Method.invoke(Method.java:511) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-12 11:01:17.172: E/AndroidRuntime(10297): at dalvik.system.NativeStart.main(Native Method) 
+0

请问我们可以用logcat吗? – 2013-03-12 11:00:23

+0

我已更新我的问题与logcat – 2013-03-12 11:03:18

+0

你可以请求谷歌你的异常之前问一个问题吗? – njzk2 2013-03-12 11:09:16

回答

3

onClick方法你必须检查你的任务是否已经运行。如果您尝试多次启动任务,那么您的应用将崩溃。我建议你将你的任务声明分成一个私有类,然后在onClick方法中创建这个类(在你检查它是否运行之后)。

有关更多详细信息,请参阅AsyncTask documentation。那里也有例子。

如果随后点击该按钮,我修改了您的代码以重新创建任务。找到它here。你将不得不重新做一点,因为它总是没有意义的取消它,但我决定举一个例子来说明如何去做。

+0

,但它也发生在任务完成时,我的意思是当数据显示在文本框中...我是否需要销毁任何对象? – 2013-03-12 11:06:12

+0

是的,如果旧的任务已经完成或已被取消,则必须创建一个全新的任务。这就是为什么我建议将它分为一类。 – Shade 2013-03-12 11:07:36

+0

你有没有任何示例代码? – 2013-03-12 11:08:54

1

根据你的代码,当你点击按钮时,它将执行asyntask,如果你尝试多次点击按钮,它也会多次执行任务并崩溃。所以在执行期间禁用按钮。

+0

请阅读我上面的评论 – 2013-03-12 11:42:18

相关问题