首页 文章

使用AsyncTask进行API调用

提问于
浏览
1

我正在尝试使用android studio访问流媒体/互联网API . 我的API调用在Eclipse中工作而不使用AsyncTask所以我试图在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);
}

1 回答

  • 0

    试着用这个:

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

    UTF-8是一种使用8位序列对Unicode字符进行编码的方法 .

相关问题