Android只有创建视图层次结构的原始线程才能触及其视图

时间:2016-04-26 15:47:06

标签: android json listview

程序从web获取json并添加到ListView但是我有错误 我的代码:

Thread thread =new Thread()
        {
            @Override
            public void run() {
                Looper.prepare();//En başta gerekli
                HttpClient client = new DefaultHttpClient();

HttpConnectionParams.setConnectionTimeout(client.getParams(),5000);
                try {
                    HttpPost post = new HttpPost("http://"+MainActivity.baglanti_adres+"/not/notlar_oku.php");
                    List<NameValuePair> gonderilenler = new ArrayList<NameValuePair>(2);//Verileri göndermek için arraylist tanımlama
                    gonderilenler.add(new BasicNameValuePair("eposta",kullanici_eposta));
                    post.setEntity(new UrlEncodedFormEntity(gonderilenler,"UTF_8"));//post'a verileri UTF-8 olarak ekleme
                    HttpResponse response = client.execute(post);//Verileri gönderme
                    if(response!=null)//Sayfadan gelen veri boş değil ise
                    {
                        BufferedReader oku = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));//Sayfadan gelen veriyi okumak oluşturma
                        StringBuilder kodlar =new StringBuilder();//Kodların eklendiği string
                        String satir;//döngüde kullanmak için string
                        while ((satir = oku.readLine())!=null)//döngü ile sayfadaki kodları alma
                        {
                            kodlar.append(satir+"\n");//Satir satır kodları ekleme
                        }
                        oku.close();
                        ArrayList<String> notlar_dizisi = new ArrayList<String>();//Gelen notları eklemek için arraylist
                        JSONArray json_dizi = new JSONArray(kodlar.toString());//kodları json dizisi yapma
                        if(json_dizi.length()>0)//json dizisinin boyutunu kontrol etme
                        {
                            for (int i =0;i<json_dizi.length();i++)
                            {
                                notlar_dizisi.add(json_dizi.getJSONObject(i).getString("not")+ " - "+json_dizi.getJSONObject(i).getString("Tarih")+ " - "+json_dizi.getJSONObject(i).getString("ID"));//Kullanıcıya ait notları arraliste alma
                            }
                        }
                        ArrayAdapter<String> notlar_adapter =new ArrayAdapter<String>(Anasayfa.this,android.R.layout.simple_list_item_1,android.R.id.text1,notlar_dizisi);//Arraylistteki notları listview e atmak için array adapter oluşturma
                        notlar.setAdapter(notlar_adapter);//Notları listviewe ekleme
                    }
                }
                catch (Exception e)
                {
                    Log.e("Hata1!",e.getMessage());
                }
                Looper.loop();
            }
        };
        thread.start();//Veri göndermek için thread oluşturma ve başlatma

2 个答案:

答案 0 :(得分:0)

尝试这一行:notlar.setAdapter(notlar_adapter);进入和使用ui线程。

MainActivity.this.runOnUiThread(new Runnable() {
    public void run() {
        notlar.setAdapter(notlar_adapter);
    }
});

答案 1 :(得分:0)

方法不是Android,请查看Asynctask,将您的请求代码放入doInBackground(...),使用onPostExecute中的Listener将结果输出到您的活动或片段。这样您就不会遇到线程问题。如果它只是一个快速测试,您可以使用Handler(来自android.os)在主线程上运行您的代码(Ui更改必须在主线程上)

new Handler().post(new Runnable() {
    @Override
    public void run() {
        // code which changes UI
        }
    });