【问题标题】:Pass an Object From AsyncTask doInBackground to OnPostExecute将对象从 AsyncTask doInBackground 传递到 OnPostExecute
【发布时间】:2014-12-19 15:01:11
【问题描述】:

我试图将一个对象从 do​​InBackground 传递到 OnPostExecute 但失败了。 我读过类似的主题,发现它们不相关。 (也许我没有足够的经验) 我是android的新手,想要一些指针。 为了便于阅读,我将粘贴相关代码而不是所有代码。

主要活动

public void processFinish(Question q) {
    TextView tview;
    tview = (TextView)findViewById(R.id.textView1);
    tview.setText(q.getQuestion());
}

AsyncTask(Q 是一个对象)

public class getQus extends AsyncTask<String,Void,Question> {
public AsyncResponse delegate;
@Override
protected Question doInBackground(String... params) {
    String range = "1";
    // TODO Auto-generated method stub
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("range",range));
    int q_id = 0;
    String result=null;
    String q_qus =" ";
    String result2 = " ";

    Question q = new Question();

     InputStream is = null;
        try {

              HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://192.168.1.6/fyp/qus.php");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
        }catch(Exception e){
                Log.e("log_tag", "Error in http connection "+e.toString());
        }
        //convert response to string
        try{

            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                }
                is.close();

                result2=sb.toString();
        }catch(Exception e){
                Log.e("log_tag", "Error converting result "+e.toString());
        }
         System.out.println("HEllo");
        //parse json data
        try{
                JSONArray jArray = new JSONArray(result2);
                for(int i=0;i<jArray.length();i++){
                        JSONObject json_data = jArray.getJSONObject(i);
                        Log.i("log_tag","id: "+json_data.getInt("q_id")+
                                ", qus: "+json_data.getString("q_qus")
                        );
                        q.setQid(json_data.getInt("q_id"));
                        q.setQuestion(json_data.getString("q_qus"));
                        return q;
                }

        }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());
        }
        return q;

}
protected void onPostExecute(Question q) {
    System.out.println("AT ONPOSTEXECUTE");
    System.out.println(q.getQuestion());
    delegate.processFinish(q);
}

}

调查结果: 我只能在控制台中看到我的 log.i 结果。 OnPostExecute 根本不会触发。

任何帮助或建议将不胜感激。 非常感谢!

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    改变

     extends AsyncTask<String,Void,Object> 
    

     extends AsyncTask<String,Void,Question> 
    

    第三个通用参数是Result。来自文档

    Result,后台计算结果的类型。

    对于 NPE:

    public class getQus extends AsyncTask<String,Void,Question> {
    public AsyncResponse delegate;
       public getQus(AsyncResponse d) {
           delegate = d;
       }
       // other code
    }
    

    如果您的活动正在实现该接口,您只需执行以下操作:

    new getQus(ActivityName.this).execute();
    

    【讨论】:

    • 你能发布整个 AsyncTask 吗?
    • 给你! @Blackbelt 谢谢!
    • 我正在使用 stackoverflow.com/questions/12575068/… 答案将结果从 onpostexecute 传递到主要活动。
    • delegate 为空。你永远不会初始化它。谁是代表?在这里看看我的回答:stackoverflow.com/questions/16752073/…
    • 那个兄弟是什么意思?我确实在顶部初始化它,更改为 public AsyncResponse delegate = null;也不行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    相关资源
    最近更新 更多