2012-04-08 22 views
0

我想从HttpPost下载字符串,并使用Async类来执行此操作。但是,当我运行该应用程序时,它崩溃了。这是我第一次使用Async类,恐怕我做了一些非常愚蠢的事情,你能帮我找到错误吗?异步任务崩溃我的应用程序

只需要注意,我还想在获取字符串时更新列表视图。我试图做到这一点,购买他们在一个单独的方法。

代码:

public static final String PREFS_NAME = "MyPrefsFile"; 
    BufferedReader in = null; 
    String data = null; 
    String username; 
    List headlines; 
    List links; 
    String password; 
    ArrayAdapter adapter; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
      // listview method 
      ContactsandIm(); 
     new loadcontactsandIm().execute(PREFS_NAME); 

    } 

    public class loadcontactsandIm extends AsyncTask<String, Integer, String> { 
     @Override 
     protected String doInBackground(String... arg0) { 
      // TODO Auto-generated method stub 

      // Create a new HttpClient and Post Header 
      HttpClient httpclient = new DefaultHttpClient(); 

      /* login.php returns true if username and password is equal to saranga */ 
      HttpPost httppost = new HttpPost("http://gta5news.com/login.php"); 

      try { 

       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
       nameValuePairs.add(new BasicNameValuePair("username", username)); 
       nameValuePairs.add(new BasicNameValuePair("password", password)); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       // Execute HTTP Post Request 
       Log.w("HttpPost", "Execute HTTP Post Request"); 
       HttpResponse response = httpclient.execute(httppost); 
       Log.w("HttpPost", "Execute HTTP Post Request"); 
       in = new BufferedReader(new InputStreamReader(response.getEntity() 
         .getContent())); 
       StringBuffer sb = new StringBuffer(""); 
       String l =""; 
       String nl =""; 
       while ((l =in.readLine()) !=null) { 
        sb.append(l + nl); 
       } 
       in.close(); 
       data = sb.toString(); 
       ListView lv = getListView(); 
       lv.setTextFilterEnabled(true); 

       headlines.add(data); 




       setListAdapter(adapter); 
       return null; 

      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return data; 
     } 

     private StringBuilder inputStreamToString(InputStream is) { 
      String line = ""; 
      StringBuilder total = new StringBuilder(); 
      // Wrap a BufferedReader around the InputStream 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
      // Read response until the end 
      try { 
       while ((line = rd.readLine()) != null) { 
        total.append(line); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      // Return full string 
      return total; 
     } 

     } 


    public void ContactsandIm() { 
     headlines = new ArrayList(); 

     //get prefs 
     SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
     String username = settings.getString("key1", null); 
     String password = settings.getString("key2", null); 
     if(username.equals("irock97")) { 
      Toast toast=Toast.makeText(this, "Hello toast", 2000); 
      toast.setGravity(Gravity.TOP, -30, 50); 
      toast.show(); 

     } else { 
      Toast toast=Toast.makeText(this, "Hello toast", 2000); 
      toast.setGravity(Gravity.TOP, -30, 150); 
      toast.show(); 
     } 
     ArrayAdapter adapter = new ArrayAdapter(this, 
       android.R.layout.simple_list_item_1, headlines); 


    } 

} 

的logcat:

03-25 13:47:37.356: E/AndroidRuntime(2484): FATAL EXCEPTION: AsyncTask #1 
03-25 13:47:37.356: E/AndroidRuntime(2484): java.lang.RuntimeException: An error occured while executing doInBackground() 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at java.lang.Thread.run(Thread.java:1096) 
03-25 13:47:37.356: E/AndroidRuntime(2484): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.view.ViewRoot.checkThread(ViewRoot.java:2802) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.view.ViewRoot.requestLayout(ViewRoot.java:594) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.view.View.requestLayout(View.java:8125) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.view.View.requestLayout(View.java:8125) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.view.View.requestLayout(View.java:8125) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.view.ViewGroup.removeAllViews(ViewGroup.java:2255) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:196) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.app.Activity.setContentView(Activity.java:1647) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.app.ListActivity.ensureList(ListActivity.java:314) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.app.ListActivity.getListView(ListActivity.java:299) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at com.gta5news.bananaphone.ChatService$loadcontactsandIm.doInBackground(ChatService.java:87) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at com.gta5news.bananaphone.ChatService$loadcontactsandIm.doInBackground(ChatService.java:1) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
03-25 13:47:37.356: E/AndroidRuntime(2484):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 

回答

2

你工作在doInBackground,并使用你的职位上onPostExecute导致。

例如:

public class TestActivity extends Activity 
{ 
    private GetTask getTask; 
    public ListView fList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    getTask = new GetTask(); 
    getTask.execute(); 
    fList = (ListView) findViewById(R.id.lstview); 
    } 

    public class GetTask extends AsyncTask<Void, Void, List> 
    { 
    @Override 
    protected List doInBackground(Void... params) { 
     return load(); 
    }  

    @Override 
    protected void onPostExecute(List result) { 
     ArrayAdapter adapter = new ArrayAdapter(this, 
       android.R.layout.simple_list_item_1, headlines); 

     fList.setAdapter(adapter); 
    } 
    } 

    private List load() { 
    // get your data from http 
    // add to your list, probably you can use model. 
    List headlines; 
    headlines.add(data); 

    return headlines; 
    } 


} 
2

您设置doInBackground你的ListView适配器。永远不要在UI线程之外操作UI

2

您不能与除主线程以外的任何其他线程交互UI元素。您需要完成onPostExecute方法中ListView的所有交互操作。

基本上你会想要编译doInBackground方法中的web请求中的所有数据,存储在你的任务实例上,然后onPostExecute获取列表视图并设置适配器并填充数据。

+0

好吧,我来试试,并报告。 – TheBlueCat 2012-04-08 15:10:52

+0

你是说'onPostExecute'在UI线程中执行?我一直认为它也在后台线程中执行? – Ali 2012-04-08 15:34:20

+0

否,onPostExecute(),onPreExecute()和onProgressUpdate()都在UI线程上运行。 – Shubhayu 2012-04-08 16:08:46

1

首先,你必须很好地处理doInBackground(任何UI相关的任务)与UI相关的任务,我们有一个方法调用onPostExecute(),我们可以处理所有UI相关的任务.. 如果您还不想使用这些方法和处理它在doInBackground(),那么你这样做在下面的代码::::

runOnUiThread(new Runnable() { 
public void run() { 
//your UI related code stuff  
    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 
    headlines.add(data); 
    setListAdapter(adapter); //do what you like here 
} 
}); 
+0

我会在几分钟内尝试,所以我会在onPostExecute()中做所有UI元素?包括更新列表视图? – TheBlueCat 2012-04-08 17:40:27