![](/img/trans.png)
[英]How can i pass a value to an interface in Java Android Studio from MainActivity to my Interface?
[英]Why can't I get context from my MainActivity in android studio?
我的MainActivity調用getLoc(MainActivity.this)
因此它將上下文傳遞給我的另一個活動CurrentLocation。 在CurrentLocation活動中, getLoc(Context context1)
設置了全局上下文, onLocationChanged(Location location)
也使用該全局上下文來調用JsonTaskWeather()
但上下文似乎始終為null。
package com.tramtime.owner.croydontramtime;
import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.widget.TextView;
import com.tramtime.owner.croydontramtime.Controllers.JsonTask.JsonTaskWeather;
import com.tramtime.owner.croydontramtime.Views.MainActivity;
public class CurrentLocation extends Activity implements LocationListener {
private LocationManager myManager;
private CurrentLocation loc;
private double latitude;
private double longitude;
private Context context;
@Override
public void onLocationChanged(Location location) {
String src = "lat="+location.getLatitude()+"&lon="+location.getLongitude();
JsonTaskWeather jsonTaskWeather = new JsonTaskWeather(context);
jsonTaskWeather.execute(
"http://api.openweathermap.org/data/2.5/weather?"+src+"&appid=e58a3347bfbb6123ea384743a3f2e686");
}
public String see(){
String foo = "lat and lon"+latitude+" "+longitude;
return foo;
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
@TargetApi(Build.VERSION_CODES.M)
public void getLoc(Context context1) {
this.context = context1;
loc = new CurrentLocation();
myManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.INTERNET
}, 10);
return;
}else{
myManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, loc, Looper.myLooper());
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case 10:
if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED);
}
}
}
這是注銷的內容:
08-28 08:26:11.607 8752-8752/com.tramtime.owner.croydontramtime E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tramtime.owner.croydontramtime, PID: 8752
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
at com.tramtime.owner.croydontramtime.CurrentLocation.onLocationChanged(CurrentLocation.java:36)
at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:288)
at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:217)
at android.location.LocationManager$ListenerTransport$2.handleMessage(LocationManager.java:240)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5507)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-28 08:26:11.704 8752-8752/com.tramtime.owner.croydontramtime I/Process: Sending signal. PID: 8752 SIG: 9
08-28 08:33:11.592 9367-9367/com.tramtime.owner.croydontramtime I/logging again: 0.0
08-28 08:33:11.624 9367-9447/com.tramtime.owner.croydontramtime I/DpmTcmClient: RegisterTcmMonitor from: com.android.okhttp.TcmIdleTimerMonitor
問題是這是一個有缺陷的設計。 首先,如果它不是靜態的,我將無法理解如何調用getLoc函數? MainActivity是否擴展CurrentLocation類?
無論如何,這里是關於如何使其工作的建議
1)在MainActivity中直接實現LocationListener
2)使用意圖調用CurrentLocation類,並通過執行以下操作在CurrentLocation的onCreate內更新內容
Content context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
....
}
現在,上下文已正確初始化,您可以在類中的任何位置使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.