【问题标题】:get json data in ListView with AsyncTask使用 AsyncTask 在 ListView 中获取 json 数据
【发布时间】:2013-11-06 08:26:52
【问题描述】:

我想用asyncTask 在我的ListView 中显示来自我的服务器的一些数据。连接和JsonParser 运行良好,但是当我尝试将数据放入ListView 时,我的OnPostExecute() 出现错误。

所以,这是调用asynctask的类:

public class GetInfo extends Activity{ 

    ListView listeView;

    protected void onCreate(Bundle bundle)
    {
        super.onCreate(bundle);    
        setContentView(R.layout.listdata);   
        listeView = (ListView) findViewById(R.id.maListeView);     

        GetJson getJson = new GetJson(GetInfo.this);
        getJson.execute();           
    }
}

这里没有问题。这是我的课AsyncTask:

class GetJson extends AsyncTask<Void, Integer,  ArrayList<String>> {

    private Context Mycontext;
    private ListView listview; 
    private ArrayAdapter<String> arrayadapter;
    private ProgressDialog pDialog;
    private ArrayList<String> donnees;
    private ListActivity listAct;

    public GetJson(GetInfo getInfo) {
        Mycontext = getInfo;
    }

    @Override
    protected void onPreExecute() {
        // Showing progress dialog before sending http request
        this.pDialog  = new ProgressDialog(Mycontext);
        this.pDialog.setMessage("Please wait..");
        this.pDialog.setIndeterminate(true);
        this.pDialog.setCancelable(false);
        this.pDialog.show();    
    }

    @Override
    protected  ArrayList<String> doInBackground(Void... arg0) {          
        String result = null;
        InputStream is = null;
        JSONObject json_data=null;
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        this.donnees = new ArrayList<String>();

        try{
            //commmand http
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://192.168.0.100/timesync.php");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
        }
        catch(Exception e){
            Log.i("taghttppost",""+e.toString());           
        }

        //parse response
        try
        {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));         
            StringBuilder sb  = new StringBuilder();           
            String line = null;            
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }

            is.close();

            result = sb.toString();
        }
        catch(Exception e)
        {
            Log.i("tagconvertstr",""+e.toString());
        }        

        //get json data
        try{
            JSONArray jArray = new JSONArray(result);             
            for(int i=0;i<jArray.length();i++)
            {             
                json_data = jArray.getJSONObject(i);
                this.donnees.add("date :"+ json_data.getString("time") + " ou " +
                    json_data.getString("date") + json_data.getString("hour"));     
            }
        }
        catch(JSONException e){
            Log.i("tagjsonexp",""+e.toString());
        } catch (ParseException e) {
            Log.i("tagjsonpars",""+e.toString());
        }
        return this.donnees;
    }

    @Override
    protected void onPostExecute(ArrayList<String> donnees) {    
        super.onPostExecute(donnees);

        this.pDialog.dismiss();

        for(int i=0;i<donnees.size();i++)
        {             
            Log.i("time", donnees.get(i));
        } 

        // this.arrayadapter = new ArrayAdapter<String>(Mycontext, android.R.layout.simple_list_item_1, this.donnees);
        // this.listview.setAdapter(this.arrayadapter);
    }
}

我的问题是注释行:

// this.arrayadapter = new ArrayAdapter<String>(Mycontext, android.R.layout.simple_list_item_1, this.donnees);
// this.listview.setAdapter(this.arrayadapter);

我不明白为什么......

这是我的错误:

11-05 16:43:36.560: E/AndroidRuntime(11200): FATAL EXCEPTION: main
11-05 16:43:36.560: E/AndroidRuntime(11200): java.lang.NullPointerException
11-05 16:43:36.560: E/AndroidRuntime(11200):at com.json.GetJson.onPostExecute(Adapter.java:134)
11-05 16:43:36.560: E/AndroidRuntime(11200):at android.os.AsyncTask.finish(AsyncTask.java:631)
11-05 16:43:36.560: E/AndroidRuntime(11200):at android.os.AsyncTask.access$600(AsyncTask.java:177)
11-05 16:43:36.560: E/AndroidRuntime(11200):at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)

.
.
.

结果正在被记录,所以我很确定我的代码被传递到OnPostExecute()

【问题讨论】:

  • 你已经声明了列表视图吗?
  • 同时有很多响应=) 所以我试试你的解决方案,因为在 GetJson 的构造函数中确实没有 listView
  • 谢谢阿穆利亚!是工作 !我很愚蠢忘记将我的列表视图放在构造函数中..

标签: android json android-asynctask


【解决方案1】:

问题是你的列表视图没有初始化。

第 1 步)更新AsyncTask 构造函数:

public GetJson(GetInfo getInfo, ListView list) {
    Mycontext = getInfo;
    listView = list;
}

第 2 步)在OnCreate 中执行此操作

GetJson getJson = new GetJson(GetInfo.this, listeView);
getJson.execute();

【讨论】:

  • 从 getInfo 将我的 ListView 放入我的构造函数中的所有工作。谢谢大家的回复=)
【解决方案2】:

GetJson 类中删除private ListView listview; 行。 问题是您正在访问GetJson 类的listview 对象(未初始化)而不是Activity's listview 对象。

这样直接访问GetInfo Activity的listview

listview.setAdapter(this.arrayadapter);

【讨论】:

    【解决方案3】:

    您要使用哪个 ListView?一个在 GetInfo 类还是一个在 GetJson 类?

    你在GetJson类中声明的,如果你想用作它,需要实例化它

    listeView = (ListView) findViewById(R.id.xxxx);
    

    【讨论】:

      【解决方案4】:

      ListView listview 未在GetJSON 中初始化。因此你会得到NullPointerException

      您可能希望将 asynctask 设为 Activity 的内部类,并删除 GetJSON 中的 listview 声明,因为如果将其设为内部类,则它已在 GetInfo 中声明为类成员。

      listeView = (ListView) findViewById(R.id.maListeView)GetInfo 中。

      或者使用接口作为回调,例如在你的活动类中设置列表视图

      How do I return a boolean from AsyncTask?

      在您的例子中,它不是布尔值,而是 ArrayList&lt;String&gt; donnees

      【讨论】:

      • 很好,我将 listView 放在我的 asyncTaks 的构造函数中,它的工作 =) (显示 Amulya cmets)
      • @ThomasTrabelsi 我更喜欢黑带在我帖子中提供的链接中建议的委托模式。由您决定
      • @ThomasTrabelsi 可以帮助您决定vogella.com/articles/DesignPatterns/article.html
      • 谢谢我去看你的链接,这可能是有益的;)
      【解决方案5】:

      如果您在 PostExecute Menthod 上处理任何 UI 操作,请尝试以下操作:

      Handler refresh = new Handler(Looper.getMainLooper());
              refresh.post(new Runnable() {
                  public void run( ){
                                   // try UI here .
                                  });
      

      【讨论】:

        猜你喜欢
        • 2016-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        相关资源
        最近更新 更多