【问题标题】:Error AsyncTask #1错误异步任务 #1
【发布时间】:2014-11-26 14:37:21
【问题描述】:

大家好,我从我的 mysql 数据库中获取此代码

[{"u_id":"8","id":"8","name":"test1","location_long":"10.01475","location_lati":"53.57823","description":"loo\nlol","date":"2014-11-21","time":"18:00:00","date_created":"2014-11-20","date_updated":"0000-00-00"},
{"u_id":"8","id":"9","name":"test9","location_long":"10.01475","location_lati":"53.57823","description":"test9\n","date":"2014-11-21","time":"19:00:00","date_created":"2014-11-20","date_updated":"0000-00-00"}, 
{"u_id":"8","id":"10","name":"test10","location_long":"10.01475","location_lati":"53.57823","description":"lol","date":"2014-11-22","time":"19:00:00","date_created":"2014-11-20","date_updated":"0000-00-00"},
{"u_id":"8","id":"11","name":"lol","location_long":"10.01475","location_lati":"53.57823","description":"","date":"2014-11-24","time":"18:00:00","date_created":"2014-11-20","date_updated":"0000-00-00"}]

我能够将它放入我的 android 应用程序中。

我将数据插入到我的列表视图中。

for(int i = 0; i < jsonArray.length();i++)
            {
                Log.w("jsonArray:USER_ID", jsonArray.getJSONObject(i).getString("u_id"));
                Log.w("user_id:USER_ID", user_id);

                if(jsonArray.getJSONObject(i).getString("u_id")==user_id)
                    own_event = true;
                else
                    own_event = false;

                Log.w("jsonArray", jsonArray.getJSONObject(i).toString());

                adapter.add(new DataProvider(own_event,
                        jsonArray.getJSONObject(i).getString("description"),
                        jsonArray.getJSONObject(i).getString("name"),
                        jsonArray.getJSONObject(i).getString("date"),
                        jsonArray.getJSONObject(i).getString("time"),
                        jsonArray.getJSONObject(i).getDouble("location_long"),
                        jsonArray.getJSONObject(i).getDouble("location_lati"),
                        jsonArray.getJSONObject(i).getInt("id")));
            }

现在,当我在手机上运行应用程序时,出现此错误。

致命异常:AsyncTask #1 进程:com.myup2.up2,PID:4240 java.lang.RuntimeException:执行 doInBackground() 时发生错误 原因:android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。

但有时我什至没有收到错误,应用程序正在运行并显示结果。

11-26 15:31:27.892    6936-6966/com.myup2.up2 W/params﹕ [user_id=8]
11-26 15:31:29.382    6936-6966/com.myup2.up2 W/jsoninsideParser﹕ [{"u_id":"8","id":"8","eventname":"test1","location_long":"10.01475","location_lati":"53.57823","description":"loo\nlol","date":"2014-11-21","time":"18:00:00","date_created":"2014-11-20","date_updated":"0000-00-00"},{"u_id":"8","id":"9","eventname":"test9","location_long":"10.01475","location_lati":"53.57823","description":"test9\n","date":"2014-11-21","time":"19:00:00","date_created":"2014-11-20","date_updated":"0000-00-00"},{"u_id":"8","id":"10","eventname":"test10","location_long":"10.01475","location_lati":"53.57823","description":"lol","date":"2014-11-22","time":"19:00:00","date_created":"2014-11-20","date_updated":"0000-00-00"},{"u_id":"8","id":"11","eventname":"lol","location_long":"10.01475","location_lati":"53.57823","description":"","date":"2014-11-24","time":"18:00:00","date_created":"2014-11-20","date_updated":"0000-00-00"}]
11-26 15:31:29.402    6936-6966/com.myup2.up2 W/jsonArray:USER_ID﹕ 8
11-26 15:31:29.402    6936-6966/com.myup2.up2 W/user_id:USER_ID﹕ 8
11-26 15:31:29.412    6936-6966/com.myup2.up2 W/jsonArray﹕ {"id":"8","time":"18:00:00","location_lati":"53.57823","description":"loo\nlol","date_updated":"0000-00-00","date_created":"2014-11-20","date":"2014-11-21","u_id":"8","location_long":"10.01475","eventname":"test1"}
11-26 15:31:29.412    6936-6966/com.myup2.up2 W/dataprovider_item_created﹕ test1
11-26 15:31:29.412    6936-6966/com.myup2.up2 W/dataprovider_item_own_event﹕ false
11-26 15:31:29.412    6936-6966/com.myup2.up2 W/jsonArray:USER_ID﹕ 8
11-26 15:31:29.412    6936-6966/com.myup2.up2 W/user_id:USER_ID﹕ 8
11-26 15:31:29.422    6936-6966/com.myup2.up2 W/jsonArray﹕ {"id":"9","time":"19:00:00","location_lati":"53.57823","description":"test9\n","date_updated":"0000-00-00","date_created":"2014-11-20","date":"2014-11-21","u_id":"8","location_long":"10.01475","eventname":"test9"}
11-26 15:31:29.422    6936-6966/com.myup2.up2 W/dataprovider_item_created﹕ test9
11-26 15:31:29.422    6936-6966/com.myup2.up2 W/dataprovider_item_own_event﹕ false
11-26 15:31:29.422    6936-6966/com.myup2.up2 W/jsonArray:USER_ID﹕ 8
11-26 15:31:29.422    6936-6966/com.myup2.up2 W/user_id:USER_ID﹕ 8
11-26 15:31:29.432    6936-6966/com.myup2.up2 W/jsonArray﹕ {"id":"10","time":"19:00:00","location_lati":"53.57823","description":"lol","date_updated":"0000-00-00","date_created":"2014-11-20","date":"2014-11-22","u_id":"8","location_long":"10.01475","eventname":"test10"}
11-26 15:31:29.442    6936-6966/com.myup2.up2 W/dataprovider_item_created﹕ test10
11-26 15:31:29.442    6936-6966/com.myup2.up2 W/dataprovider_item_own_event﹕ false
11-26 15:31:29.442    6936-6966/com.myup2.up2 W/jsonArray:USER_ID﹕ 8
11-26 15:31:29.442    6936-6966/com.myup2.up2 W/user_id:USER_ID﹕ 8
11-26 15:31:29.452    6936-6966/com.myup2.up2 W/jsonArray﹕ {"id":"11","time":"18:00:00","location_lati":"53.57823","description":"","date_updated":"0000-00-00","date_created":"2014-11-20","date":"2014-11-24","u_id":"8","location_long":"10.01475","eventname":"lol"}
11-26 15:31:29.452    6936-6966/com.myup2.up2 W/dataprovider_item_created﹕ lol
11-26 15:31:29.452    6936-6966/com.myup2.up2 W/dataprovider_item_own_event﹕ false

当错误出现时,它会向我显示这些不同的地方:

adapter.registerDataSetObserver(new DataSetObserver(){
            @Override
            public void onChanged() {
                super.onChanged();
                listview.setSelection(adapter.getCount()-1);
            }
        });

@Override
    public void add(DataProvider object) {
        event_list.add(object);
        super.add(object);
    }

但他们都没有真正的帮助

我什至不知道从哪里开始寻找错误。也许你们中的某个人可以在这方面帮助我。

编辑1:

保存第一个条目后总是显示此错误。

11-26 15:40:34.702    8062-8093/com.myup2.up2 W/jsonArray﹕{"id":"8","time":"18:00:00","location_lati":"53.57823","description":"loo\nlol","date_updated":"0000-00-00","date_created":"2014-11-20","date":"2014-11-21","u_id":"8","location_long":"10.01475","eventname":"test1"}
11-26 15:40:34.702    8062-8093/com.myup2.up2 W/dataprovider_item_created﹕ test1
11-26 15:40:34.702    8062-8093/com.myup2.up2 W/dataprovider_item_own_event﹕ false
11-26 15:40:34.702    8062-8093/com.myup2.up2 W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x41771ce0)
11-26 15:40:34.922    8062-8093/com.myup2.up2 E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1

编辑2:

protected String doInBackground(String... args) {
            // TODO Auto-generated method stub
            // Check for success tag
            int success;

            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(Home.this);
            String user_id = sp.getString("user_id", "anon");

            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("user_id", user_id));

                Log.w("params", params.toString());

                Log.d("request!", "starting");
                // getting product details by making HTTP request
                JSONArray jsonArray = jsonParser.makeHttpRequest(
                        EVENTS_URL, "POST", params);



                for(int i = 0; i < jsonArray.length();i++)
                {
                    Log.w("jsonArray:USER_ID", jsonArray.getJSONObject(i).getString("u_id"));
                    Log.w("user_id:USER_ID", user_id);

                    if(jsonArray.getJSONObject(i).getString("u_id")==user_id)
                        own_event = true;
                    else
                        own_event = false;

                    Log.w("jsonArray", jsonArray.getJSONObject(i).toString());

                    adapter.add(new DataProvider(own_event,
                            jsonArray.getJSONObject(i).getString("description"),
                            jsonArray.getJSONObject(i).getString("eventname"),
                            jsonArray.getJSONObject(i).getString("date"),
                            jsonArray.getJSONObject(i).getString("time"),
                            jsonArray.getJSONObject(i).getDouble("location_long"),
                            jsonArray.getJSONObject(i).getDouble("location_lati"),
                            jsonArray.getJSONObject(i).getInt("id")));
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;

        }

【问题讨论】:

  • 您无法在doInBackground 上更改您的适配器。使用onPostExecute
  • 你能提供你的doInBackground方法吗?

标签: android json android-listview android-asynctask


【解决方案1】:

您必须将方法移至 UI 线程。在您的情况下onPostExecute,您不能在后台线程中修改视图等。

protected ArrayList<DataProvider> doInBackground(String... args) {
            // TODO Auto-generated method stub
            // Check for success tag
            int success;

            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(Home.this);
            String user_id = sp.getString("user_id", "anon");

            ArrayList<DataProvider> dataProviders = new ArrayList<DataProvider>();

            try {
                // Building Parameters
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("user_id", user_id));

                Log.w("params", params.toString());

                Log.d("request!", "starting");
                // getting product details by making HTTP request
                JSONArray jsonArray = jsonParser.makeHttpRequest(
                        EVENTS_URL, "POST", params);



                for(int i = 0; i < jsonArray.length();i++)
                {
                    Log.w("jsonArray:USER_ID", jsonArray.getJSONObject(i).getString("u_id"));
                    Log.w("user_id:USER_ID", user_id);

                    if(jsonArray.getJSONObject(i).getString("u_id")==user_id)
                        own_event = true;
                    else
                        own_event = false;

                    Log.w("jsonArray", jsonArray.getJSONObject(i).toString());

                    dataProviders.add(new DataProvider(own_event,
                            jsonArray.getJSONObject(i).getString("description"),
                            jsonArray.getJSONObject(i).getString("eventname"),
                            jsonArray.getJSONObject(i).getString("date"),
                            jsonArray.getJSONObject(i).getString("time"),
                            jsonArray.getJSONObject(i).getDouble("location_long"),
                            jsonArray.getJSONObject(i).getDouble("location_lati"),
                            jsonArray.getJSONObject(i).getInt("id")));
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

            return dataProviders;

        }


    protected void onPostExecute(ArrayList<DataProvider> list)
{
    for(int i = 0; i < list.size(); i++){
        adapter.add(list.get(i));
    }
} 

【讨论】:

  • 所以我在从 doinbackground 获取数据后调用另一个名为“onPostExcecute”的函数?
  • 您必须从 AsyncTask 中覆盖“onPostExecute”,就像覆盖“doInBackground”一样。
  • 如果您不熟悉使用AsyncTask,您可能会发现这很有帮助:hiqes.com/androids-asynctask-explained
  • 但是在我运行 doInBackground 之后如何调用 onPostExcecute 呢?因为首先我需要来自服务器的响应,然后更改 ui
  • 你不调用 onPostExecute。 doInBackground 完成后,会自动调用 onPostExecute。
【解决方案2】:

问题是由在您的 doInBackground() 方法中操作您的 ListView 引起的。您需要将操作移至onPostExecute() 方法中。如果您在 doInBackground() 方法中创建 DataSetObserver() 时要小心,因为它可能绑定到 AsyncTask 使用的后台线程而不是 UI 线程。

【讨论】:

    【解决方案3】:

    在 UI 上更新内容时,您必须在 UI 线程上更新它们,该线程是异步的 OnPostExecute。示例。

    public class UpdateUIThread extends AsyncTask<Void,Void,Void>{
        JSONArray array;
        @Override
        protected Void doInBackground(Void... params) {
        //Do Network Stuff Here
        //array = (Insert String Here)
        }
    
        @Override
        protected void onPostExecute(Void result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            for(int i = 0; i < jsonArray.length();i++){
            JSONObject jObj  = array.getJSONObject(i);
          String string1 = jObj.getString("Name Of Object");
             adapter.add(new YourClass(string1));
            }
        }
    } 
    

    【讨论】:

      【解决方案4】:

      您不能也不应该在非 UI 线程的线程中修改 UI。

      喜欢它:

      protected JSONArray doInBackground(String... args)
      {
          // Check for success tag
          int success;
      
          SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(Home.this);
          String user_id = sp.getString("user_id", "anon");
      
          try {
              // Building Parameters
              List<NameValuePair> params = new ArrayList<NameValuePair>();
              params.add(new BasicNameValuePair("user_id", user_id));
      
              Log.w("params", params.toString());
      
              Log.d("request!", "starting");
              // getting product details by making HTTP request
              return jsonParser.makeHttpRequest(EVENTS_URL, "POST", params);    
          }
          catch (Exception e)
          {
              e.printStackTrace();
          }
      
          return null;
      }
      

      然后:

      protected void onPostExecute(JSONArray jsonArray)
      {
          for(int i = 0; i < jsonArray.length();i++)
          {
              Log.w("jsonArray:USER_ID", jsonArray.getJSONObject(i).getString("u_id"));
              Log.w("user_id:USER_ID", user_id);
              if(jsonArray.getJSONObject(i).getString("u_id")==user_id)
                  own_event = true;
              else
                  own_event = false;
      
              Log.w("jsonArray", jsonArray.getJSONObject(i).toString());
              adapter.add(new DataProvider(own_event,
                  jsonArray.getJSONObject(i).getString("description"),
                  jsonArray.getJSONObject(i).getString("eventname"),
                  jsonArray.getJSONObject(i).getString("date"),
                  jsonArray.getJSONObject(i).getString("time"),
                  jsonArray.getJSONObject(i).getDouble("location_long"),
                  jsonArray.getJSONObject(i).getDouble("location_lati"),
                  jsonArray.getJSONObject(i).getInt("id")));
          }
          // Other stuff already in onPostExecute
      } 
      

      【讨论】:

      • 这只会返回 jsonarray 中的第一个元素!
      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多