java - 异步任务使我的应用程序崩溃

标签 java android http listview android-asynctask

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

请注意,我还想在获取字符串时更新我的​​ ListView 。我尝试这样做,购买将它们放入单独的方法中。

代码:

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);


    }

}

日志猫:

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)

最佳答案

您在 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;
  }


}

关于java - 异步任务使我的应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063694/

相关文章:

java - 同一个 JPA 类的多个数据库支持

java - 从 Java 字符串转换为 Windows-1252 格式

http - ASP Core API - 自定义未经授权的正文

c# - 使用 HttpWebResponse 读取 "chunked"响应

java - 对象数组困惑

java - Spring Request映射期

android - Google Fusion Tables - 从 android 访问数据和插入数据

Android 5.0 Lollipop 和 4.4 KitKat 忽略我的 WiFi 网络,enableNetwork() 没用

java - Android:我如何找到文件路径

ruby - 自动向 ruby​​ 中的所有 HTTP 连接添加代理