AsyncTast onPostExecute不更新UI元素:抛出NullPointerException

时间:2012-12-07 17:24:12

标签: android android-asynctask

我从一时间陷入困境。 这是我的代码

public class PilgrimFriendActivity extends Activity {

    private String DOMAIN = "http://";

    private String LAWS_URL = "";
    private String LOCATIONS_URL = "";

    private ListView list;
    private TextView content;
    private Law law  ;
    private Location location;
    private ProgressDialog dialog;
    private SharedPreferences preferences;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        preferences = getSharedPreferences("com.hackontech.pilgrim_preferences", MODE_PRIVATE);
        this.DOMAIN += preferences.getString("DOMAIN","192.168.0.104");
        this.LAWS_URL = DOMAIN + "/pilgrimfriend/main/getAllLaws";
        this.LOCATIONS_URL = DOMAIN + "/pilgrimfriend/main/getAllLocations";

        dialog = new ProgressDialog(this);
        content = (TextView) findViewById(R.id.content);
        list = (ListView) findViewById(R.id.laws);
        this.lLaws();

    }


    public void lLaws() {

        final class RequestTask extends AsyncTask<String, String, String>{

            private String URL = null;

            @Override
            protected String doInBackground(String... uri) {
                String result = null;
                URL = uri[0];
                try {

                    //Create default http client
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpGet httpget = new HttpGet(URL);
                    Log.v("URL",URL);
                    HttpResponse response = httpclient.execute(httpget);
                    //Retrieve the response body or "entity"
                    HttpEntity entity = response.getEntity();
                    //Return the entity as String
                    result = EntityUtils.toString(entity);
                    Log.v("result",result.toString());

                } catch (Exception e) {
                    return e.getMessage();
                }

                return result;
            }

            @Override
            protected void onPostExecute(String result) {
                //super.onPostExecute(result);
                dialog.dismiss();
                try{

                    JSONArray jArray = new JSONArray(result);

                    JSONObject json_data;
                    ArrayList<String> items = new ArrayList<String>();
                    for(int i=0; i < jArray.length() ; i++) {
                        json_data = jArray.getJSONObject(i);
                        int id=json_data.getInt("id");
                        String title=json_data.getString("title");
                        String scholor =json_data.getString("scholor");
                        items.add(title+" ("+scholor+")");
                    }

                    content.setText(result);
                    ArrayAdapter<String> mArrayAdapter = new ArrayAdapter<String>(getApplicationContext(),  
                            android.R.layout.simple_list_item_1, items);
                    list.setAdapter(mArrayAdapter);

                    Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();

                }
                catch(JSONException e) {
                    //content.setText(e.getMessage());
                }
                //Do anything with response..
            }

            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();

                dialog.setTitle("Downloading Laws Data");
                dialog.show();
            }

        }

        new RequestTask().execute(LAWS_URL);
    }

我的每一种方法都在工作,但在onPostExecute当我更改视图元素时,就像我content.setText(result)一样,应用程序立即停止,问题是什么。

这是LogCat

12-07 22:44:33.302: E/AndroidRuntime(778): FATAL EXCEPTION: main
12-07 22:44:33.302: E/AndroidRuntime(778): java.lang.NullPointerException
12-07 22:44:33.302: E/AndroidRuntime(778):  at com.hackontech.pilgrim.PilgrimFriendActivity$1RequestTask.onPostExecute(PilgrimFriendActivity.java:120)
12-07 22:44:33.302: E/AndroidRuntime(778):  at com.hackontech.pilgrim.PilgrimFriendActivity$1RequestTask.onPostExecute(PilgrimFriendActivity.java:1)
12-07 22:44:33.302: E/AndroidRuntime(778):  at android.os.AsyncTask.finish(AsyncTask.java:417)
12-07 22:44:33.302: E/AndroidRuntime(778):  at android.os.AsyncTask.access$300(AsyncTask.java:127)
12-07 22:44:33.302: E/AndroidRuntime(778):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
12-07 22:44:33.302: E/AndroidRuntime(778):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-07 22:44:33.302: E/AndroidRuntime(778):  at android.os.Looper.loop(Looper.java:123)
12-07 22:44:33.302: E/AndroidRuntime(778):  at android.app.ActivityThread.main(ActivityThread.java:3683)
12-07 22:44:33.302: E/AndroidRuntime(778):  at java.lang.reflect.Method.invokeNative(Native Method)
12-07 22:44:33.302: E/AndroidRuntime(778):  at java.lang.reflect.Method.invoke(Method.java:507)
12-07 22:44:33.302: E/AndroidRuntime(778):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-07 22:44:33.302: E/AndroidRuntime(778):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-07 22:44:33.302: E/AndroidRuntime(778):  at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:0)

出于某种原因,onPostExecute方法在方法完成时立即执行所有UI更新。

例如:

@Override
protected Void doInBackground() {
    someTextView.setText("Do In Background Finished!");
}

@Override
protected void onPostExecute () {
    someTextView.setText("Post Execute Started");
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // ..
    }
    someTextView.setText("Post Execute Finished");
}

将导致显示&#34;在后台完成!&#34; 5秒后(当onPostExecute结束时)将使用&#34; Post Execute Started&#34;更新文本。并立即使用&#34; Post Execute Finished&#34;。

再次更新文本