簡體   English   中英

使用AsyncTask進行API調用

[英]API call with AsyncTask

我正在嘗試使用android studio訪問流媒體/互聯網API。 我的API調用無需使用AsyncTask就可以在Eclipse中工作,因此我試圖在Android Studio中使用AsyncTask來調用該API,但是我不確定為什么它不起作用。 調用工作時,我使用緩沖讀取器和輸入流的方式與在eclipse中使用它們的方式相同。 我也有權在我的AndroidManifest.xml中使用互聯網。

注意:出於明顯的原因,我取出了API密鑰。

    import android.content.Intent;
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.os.AsyncTask;
    import android.view.View;
    import android.widget.EditText;
    import android.view.View.OnClickListener;
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import android.widget.Button;
    import android.widget.Toast;

 public class MainActivity extends Activity implements OnClickListener {

private static final String TAG_DEBUG = MainActivity.class.getName();
public static final String TAG_ID = "id";
public static final String TAG_CURRENTTEMP = "currenttemp";
public static final String TAG_MAXTEMP = "maxtemp";
public static final String TAG_MINTEMP = "mintemp";

private EditText enteredzip;
private String zip;
private Button button;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    enteredzip = (EditText) findViewById(R.id.editText);

    button = (Button) findViewById(R.id.button);

    button.setOnClickListener(this);
}


public void onClick(View v) {
    zip = enteredzip.getText().toString();

    new RetrieveFeedTask().execute();

}

class RetrieveFeedTask extends AsyncTask<Void, Void, String> {

    private Exception exception;

    protected void onPreExecute() {
    }

   protected String doInBackground(Void... urls) {

        String BASE_URL = "http://api.openweathermap.org/data/2.5/weather?zip=";
        String API_CALL = "&APPID=key";
        // Do some validation here
        HttpURLConnection con = null;
        InputStream is = null;
        String bufferedOutput = "";
        try {
            con = (HttpURLConnection) (new URL(BASE_URL + zip + API_CALL)).openConnection();
            con.setRequestMethod("GET");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.connect();

            StringBuffer buffer = new StringBuffer();
            is = con.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = null;
            while((line = br.readLine()) != null)
                buffer.append(line + "\r\n");
            is.close();
            con.disconnect();
            bufferedOutput = buffer.toString();
            return bufferedOutput;
        }
        catch(Exception e) {
            Log.e("ERROR", e.getMessage(), e);
            return null;
        } finally {
            try{
                is.close();
            }catch(Throwable T){}
            try{
                con.disconnect();
            }catch(Throwable T){}
        }
    }

    protected void onPostExecute(String response) {
        if(response == null) {
            //response = "THERE WAS AN ERROR";
            //Toast.makeText(MainActivity.this, getResources().getString(R.string.error_et), Toast.LENGTH_LONG).show();
            return;
        }
        //Log.i("INFO", response);
        // TODO: check this.exception
        // TODO: do something with the feed
        Toast.makeText(MainActivity.this, response, Toast.LENGTH_LONG).show();
        String id = "";
        String currenttemp = "";
        String maxtemp = "";
        String mintemp = "";


        for (int i = 0; i < response.length(); i++) {
            if (response.substring(i, i + 2).equals("id")) {
                id = response.substring(i + 4, i + 7);
                break;
            }
        }

        for (int i = 0; i < response.length(); i++) {
            if (response.substring(i, i + 4).equals("temp")) {
                currenttemp = response.substring(i + 6, i + 9);
                break;
            }
        }

        for (int i = 0; i < response.length(); i++) {
            if (response.substring(i, i + 8).equals("temp_min")) {
                mintemp = response.substring(i + 10, i + 13);
                break;
            }
        }

        for (int i = 0; i < response.length(); i++) {
            if (response.substring(i, i + 8).equals("temp_max")) {
                maxtemp = response.substring(i + 10, i + 13);
                break;
            }
        }

        launchMain2Activity(id, currenttemp, maxtemp, mintemp);
    }
}

private void launchMain2Activity(String id, String currenttemp, String maxtemp, String mintemp) {
    Intent Main2Activity = new Intent(MainActivity.this, Main2Activity.class);

    Main2Activity.putExtra(TAG_ID, id);
    Main2Activity.putExtra(TAG_CURRENTTEMP, currenttemp);
    Main2Activity.putExtra(TAG_MAXTEMP, maxtemp);
    Main2Activity.putExtra(TAG_MINTEMP, mintemp);


    startActivity(Main2Activity);
}

嘗試使用這個:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")) ; 

UTF-8是一種使用8位序列編碼Unicode字符的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM