无法理解android asyncTask

时间:2014-02-09 09:34:24

标签: java android android-asynctask

我有一个应该获得JSON响应的方法。 这是:

public  HttpResponse getJson() {
        HttpResponse response = null;
        try {        
                HttpClient client = new DefaultHttpClient();
                HttpGet request = new HttpGet();
                request.setURI(new URI("https://mysite.com/android/showJson.php"));
                response = client.execute(request);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }   
            return response;
        }

showJson.php会返回此信息:["item 1","item 2"]

我遇到的问题是我无法在getJson内拨打onCreate,因为它引发了错误:android.os.NetworkOnMainThreadException

我注意到我的方法应该在一个单独的类中,以便在onCreate内调用它,但我无法管理它。我真的要哭了,我无法理解asyncTask的语法!我知道我错过了一些小事,但我无法将其视为初学者。

以下是onCreate方法:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top_jokes);    

        getJson();
        String[] myStringArray = {"a","b","c","a","b","c","a","b","c","a","b","c","a","b","c","a","b","c"};

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
                android.R.layout.simple_list_item_1, myStringArray);

        ListView listView = (ListView) findViewById(R.id.topJokesList);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // When clicked, show a toast with the TextView text
                Toast.makeText(getApplicationContext(),
                ((TextView) view).getText(), Toast.LENGTH_SHORT).show();
            }
        });

    }

我正在使用一些测试值填充数组并将它们传递给listView,但现在我需要用getJson项填充它。

2 个答案:

答案 0 :(得分:1)

有很多关于如何使用asynctasks的例子,这里有一个:

AsyncTask Android example

基本上,您应该添加将扩展AsyncTask的新类,并将后台任务(在您的案例中为getJson();)添加到doInBackground。在您的onCreate中,您在AsyncTask实例上调用execute()。当AsyncTask完成时,它将执行onPostExecute,它将在UI线程上执行,这是您可以更新UI的地方。

在onCreate中,您可以使用空数组将列表适配器设置为listview。在onPostExecute中,您应该使用新值更新ListView。实际上,最好在doInBackground中解析你的json,然后返回它引用的ArrayList,它将在onPostExecute中用来更新ListView。

答案 1 :(得分:1)

您需要一个AsyncTask,您可以在doInBackground方法中执行请求 当您收到回复时,需要使用onPostExecute方法通知主线程(ui)。

private class JsonTaskTask extends AsyncTask<Void, Void, Void> {
 private HttpResponse response;
 protected Long doInBackground(Void... params) {
     reponse = getJson();
     return null;
 }

 protected void onPostExecute(Void params) {
     //Show Your Listview
 }

 public  HttpResponse getJson() {
    HttpResponse response = null;
    try {        
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI("https://mysite.com/android/showJson.php"));
            response = client.execute(request);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }   
        return response;
    }
  }

通过

调用AsyncTask
new JsonTaskTask().execute(void, void, void);


要通知UI并更新ListView,您可以使用侦听器界面。例如就像我在this回答中所示。