繁体   English   中英

在AsyncTask中使用setter方法onPostExecute

[英]Using setter method in AsyncTask onPostExecute

我的onPostExecute方法需要将结果返回给onCreate()以便它可以做一些事情,但是我正努力到达那里。

public class ScheduleList extends Activity {

    public String url = "http://www.bbc.co.uk/bbcnews/programmes/schedules/today.json";

    private DownloadJSON mTask = null;


    public static String fetchedJSON = "";
    public static String getFetchedJSON() {
       return fetchedJSON;
    }
  public static void setFetchedJSON(String fetchedJSON) {
     ScheduleList.fetchedJSON = fetchedJSON;
  }


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_schedule_list);

    // Show the Up button in the action bar.
    setupActionBar();

    TextView tvNotice = (TextView) findViewById(R.id.schedulePreamble);
    tvNotice.setText("Well, hello there...");

    System.out.println("Hello");
    downloadPage();
    System.out.println(getFetchedJSON());

}


public class DownloadJSON extends AsyncTask<String, Integer, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

    }

    @Override
    protected String doInBackground(String... urls) {
        String response = "";
        for (String url : urls) {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            try {
                HttpResponse execute = client.execute(httpGet);
                InputStream content = execute.getEntity().getContent();

                BufferedReader buffer = new BufferedReader(new InputStreamReader(
                        content));
                String s = "";
                while ((s = buffer.readLine()) != null) {
                    response += s;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return response;
    }

    @Override
    public void onPostExecute(String result) {
        setFetchedJSON(result);
    }


}

private void downloadPage() {
    if (mTask != null && mTask.getStatus() != DownloadJSON.Status.FINISHED) {
        mTask.cancel(true);
    }
    mTask = (DownloadJSON) new DownloadJSON().execute(new String[] { url });
}

}

每次我运行代码时, System.out.println(getFetchedJSON()); 什么都不返回,这意味着我的onPostExecute实际上根本没有更改任何变量的内容,对吗?

我已经修改了代码,该代码将从Url获​​取JSON并将其转换为String和Json Objecct

public class MainActivity extends Activity {
InputStream is = null;
JSONObject jObj = null;
String json = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button b = (Button) findViewById(R.id.button1);

    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            // Making HTTP request
            try {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

                StrictMode.setThreadPolicy(policy); 
                // defaultHttpClient
                String url = "http://api.androidhive.info/contacts/";
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();           

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            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();
                json = sb.toString();
            } catch (Exception e) {
                Log.e("Buffer Error", "Error converting result " + e.toString());
            }

            // try parse the string to a JSON object
            try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

            // return JSON String

        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

在Android清单中添加以下行:

    <uses-permission android:name="android.permission.INTERNET" />

方法downloadPage()启动您的任务。 此任务在其他线程中执行,并且在启动任务后立即要打印结果,但任务尚未结束。 试试这个代码:

公共类ScheduleList扩展Activity {

 public String url = "http://www.bbc.co.uk/bbcnews/programmes/schedules/today.json"; private DownloadJSON mTask = null; public static String fetchedJSON = ""; public static String getFetchedJSON() { return fetchedJSON; } public static void setFetchedJSON(String fetchedJSON) { ScheduleList.fetchedJSON = fetchedJSON; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_schedule_list); // Show the Up button in the action bar. setupActionBar(); TextView tvNotice = (TextView) findViewById(R.id.schedulePreamble); tvNotice.setText("Well, hello there..."); System.out.println("Hello"); downloadPage(); } public void printFetchedJSON() { System.out.println(getFetchedJSON()); } public class DownloadJSON extends AsyncTask<String, Integer, String> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override protected String doInBackground(String... urls) { String response = ""; for (String url : urls) { DefaultHttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); try { HttpResponse execute = client.execute(httpGet); InputStream content = execute.getEntity().getContent(); BufferedReader buffer = new BufferedReader(new InputStreamReader( content)); String s = ""; while ((s = buffer.readLine()) != null) { response += s; } } catch (Exception e) { e.printStackTrace(); } } return response; } @Override public void onPostExecute(String result) { setFetchedJSON(result); printFetchedJSON(); } } private void downloadPage() { if (mTask != null && mTask.getStatus() != DownloadJSON.Status.FINISHED) { mTask.cancel(true); } mTask = (DownloadJSON) new DownloadJSON().execute(new String[] { url }); } 

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM