Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用runOnUiThread获取当前位置_Java_Android_Geolocation_Google Play Services - Fatal编程技术网

Java 使用runOnUiThread获取当前位置

Java 使用runOnUiThread获取当前位置,java,android,geolocation,google-play-services,Java,Android,Geolocation,Google Play Services,我是安卓系统的学习者。我正在尝试获取当前位置的天气。我的应用程序中有一个“刷新”按钮,可以用最新的天气细节更新用户界面。当应用程序加载时,它会显示0.0、0.0纬度和经度的天气。当我点击“刷新”按钮时,它会显示我当前位置的天气。当应用程序加载时,如何获取当前位置的天气?我使用谷歌Play服务获取当前位置。下面是我的代码 MainActivity.java public class MainActivity extends ActionBarActivity implements GoogleAp

我是安卓系统的学习者。我正在尝试获取当前位置的天气。我的应用程序中有一个“刷新”按钮,可以用最新的天气细节更新用户界面。当应用程序加载时,它会显示0.0、0.0纬度和经度的天气。当我点击“刷新”按钮时,它会显示我当前位置的天气。当应用程序加载时,如何获取当前位置的天气?我使用谷歌Play服务获取当前位置。下面是我的代码

MainActivity.java

public class MainActivity extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener {

    public String apiKey;
    public double latitude;
    public double longitude;
    public String forecastUrl;
    public static final String TAG = MainActivity.class.getSimpleName();
    private GoogleApiClient mGoogleApiClient;
    protected Location mLastLocation;

    public MainActivity() {
        apiKey = “XXXXXXXXXX";
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        buildGoogleApiClient();
        mRefreshImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getForecast();
            }
        });
        getForecast();
    }

    protected synchronized void buildGoogleApiClient() {
        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    protected void onResume() {
        super.onResume();
        mGoogleApiClient.connect();
    }

    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    private void getForecast() {
        if (isNetworkAvailable()) {
            forecastUrl = “http://www.forecastUrlGoesHere.com/" + apiKey + “/“ + latitude + "," + longitude;
            toggleRefresh();

            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url(forecastUrl).build();
            client.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Request request, IOException e) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            toggleRefresh();
                        }
                    });
                }

                @Override
                public void onResponse(Response response) throws IOException {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            toggleRefresh();
                        }
                    });
                    try {
                        String jsonData = response.body().string();
                        if (response.isSuccessful()) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    updateView(); //updates the screen ui
                                }
                            });
                        } else {
                            alertUserAboutError();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {

                    }
                }
            });
        } else {
            Toast.makeText(this, getString(R.string.network_error_message), Toast.LENGTH_LONG).show();
        }
    }

    private void updateView() {
    //code to update ui
    }

    private boolean isNetworkAvailable() {
    //check network availability
    }

    private void alertUserAboutError() {
        AlertDialogFragment dialog = new AlertDialogFragment();
        dialog.show(getFragmentManager(), "error_dialog");
    }

    private void toggleRefresh() {
    }

    @Override
    public void onConnected(Bundle bundle) {
        mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (mLastLocation != null) {
            latitude = mLastLocation.getLatitude();
            longitude = mLastLocation.getLongitude();
            Toast.makeText(this, latitude + " " + longitude, Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, getString(R.string.no_location_detected), Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "Connection suspended");
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        if (connectionResult.hasResolution()) {
            try {
                connectionResult.startResolutionForResult(this, 9000);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        } else {
            Log.i(TAG, "Connection failed, ERROR: " + connectionResult.getErrorCode());
        }
    }
}

有几种方法可以达到预期的效果。让我为其中一个写下步骤:

a) 使用ProgressDialog并在onCreate中启动它

b) 从onCreate中移动getForecast()

c) 在OnConnect方法中,一旦lat和long可用,检查ProgressDialog是否仍然可见。如果是,请关闭此对话框并调用getForecast

进程对话框链接

在您的
onConnected
回调中,调用
getForecast()

@Override
public void onConnected(Bundle bundle) {
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if (mLastLocation != null) {
        latitude = mLastLocation.getLatitude();
        longitude = mLastLocation.getLongitude();
        Toast.makeText(this, latitude + " " + longitude, Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(this, getString(R.string.no_location_detected), Toast.LENGTH_LONG).show();
    }

    getForecast();
}