0

我对 AsyncTasks 的经验接近 0,所以请记住这一点!

我正在尝试通过 Web 服务访问外部数据库,所以我知道我必须使用 AsyncTask。这是我的代码。在第 73 行,出于某种原因,一切都中断了。

这是日志文件,在我的代码的第 73 行开始抛出异常。当我尝试通过单步调试代码进行调试时,我不断收到“找不到源”。

也许我不明白 AsyncTasks 是如何工作的,但我假设在第 67 行之后,我的 JSONArray 对象 'json' 被设置,然后我可以在该行之后使用它......

任何帮助将不胜感激!

4

3 回答 3

1

不要在onCreate()方法中创建类,类总是比方法更高的结构。

你有 NPE bc asynctask 需要一些时间来完成,所以只需运行你的任务并进行onPostExecute()解析。

于 2012-11-23T02:05:40.377 回答
0

创建一个在onCreate()之外扩展AsyncTask的类。(不仅在这种情况下)您总是需要在方法之外创建类(除了匿名内部类等某些情况,当然这又是另一个大讨论)。然后在 onCreate() 方法中创建 AsyncTask 类的对象,并使用该对象调用方法以在不同的线程中运行该任务。根据您的代码,您无法区分这些东西。在doInBackground()中,您编写代码以获取需要在不同线程上运行的数据,在onPostExecute()方法中,您获取从 doInBackground 获得的数据并更新 UI。要更新 UI,您可以使用runOnUIThread()execute()如下所示.. 以下是根据您的要求的伪代码(未经测试)..

public class AllEventActivity extends Activity {

    private ListView listView1;
    private String tag = "all";
    private JSONArray json;
    View header;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



                List<AllEvent> weather_data = new ArrayList<AllEvent>();
//        AllEvent weather_data[] = new AllEvent[]
//        {
//            new AllEvent(R.drawable.a, "Soccer Field"),        
//        };


                weather_data.add(new AllEvent(R.drawable.a, "a", "b", "c", "d", "e"));


        listView1 = (ListView)findViewById(R.id.listView1); //

        header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null);

        new All_Events_DB_Connect().execute(new String[] {"all"});

    }

    class All_Events_DB_Connect extends AsyncTask<String, Void, JSONArray>
    {

            @Override
            protected JSONArray doInBackground(String... arg0)
            {
                    String tag = arg0[0];
                    UserFunctions u = new UserFunctions();
                    //JSONObject json = new JSONObject();
                    JSONArray json = new JSONArray();
                    try
                    {
                            json = u.getAllEvents(tag);

                    }
                    catch(Exception e)
                    {
                            Log.e("Error", e.getMessage());
                    }
                    return json;
            }
            @Override
            protected void onPostExecute(JSONArray arr)
            {
                    //returnedJson = json;
                    json = arr;

                    runOnUiThread(new Runnable() {
                        public void run() {

                             JSONObject j = new JSONObject();

                             for (int i = 0; i < json.length(); i++)
                             {
                                     try
                                     {
                                             j = json.getJSONObject(i);
                                             Toast.makeText(this, j.getString("hostName"), Toast.LENGTH_LONG).show();
                                     }
                                     catch (Exception e)
                                     {
                                             Log.e("JSON Error", e.getMessage());
                                     }
                             }


                            AllEventAdapter adapter = new AllEventAdapter(this,
                                    R.layout.listview_item_row, weather_data);

                            listView1.addHeaderView(header);

                            listView1.setAdapter(adapter);

                        }
                    });
            }
    }
}
于 2012-11-23T03:21:34.590 回答
0

您在第 73 b/c 行失败,您的 AsyncTask 在您尝试使用它时尚未实例化 json 变量。请记住,AsnycTask 运行在一个单独的进程上,任何需要使用 json 变量完成的工作都需要在 AsyncTask 的 onPostExecute 方法中完成。此方法在 UI 线程上运行,因此可以在那里进行 UI 工作。

于 2012-11-23T02:40:34.863 回答