gpt4 book ai didi

java - 如何修复空对象引用上的 'void android.widget.TextView.setText(java.lang.CharSequence)'?

转载 作者:行者123 更新时间:2023-12-01 16:23:15 25 4
gpt4 key购买 nike

我是安卓新手。我目前正在开发一个在 map 上显示多个位置的应用程序,该应用程序的标记位置取 self 已经设置的中央数据库,并且我知道正在工作如何解决我的问题。

这是我的 MainActivity.java 代码

package com.example.defiblocator;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Bundle;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import org.w3c.dom.Text;


public class MainActivity extends FragmentActivity implements OnMapReadyCallback,
LocationListener,GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {

GoogleMap mapAPI;
SupportMapFragment mapFragment;
Location mLastLocation;
Marker mCurrLocationMarker;
GoogleApiClient mGoogleApiClient;
LocationRequest mLocationRequest;
public static TextView data;



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fetchData process = new fetchData();
process.execute();
mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.mapAPI);
mapFragment.getMapAsync(this);

}



@Override
public void onMapReady(GoogleMap googleMap) {

mapAPI = googleMap;
LatLng fox = new LatLng(52.187907,-0.143284);
mapAPI.addMarker(new MarkerOptions().position(fox).title("test"));
mapAPI.moveCamera(CameraUpdateFactory.newLatLng(fox));
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
buildGoogleApiClient();
mapAPI.setMyLocationEnabled(true);
}
} else {
buildGoogleApiClient();
mapAPI.setMyLocationEnabled(true);
}

}

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

@Override
public void onConnected(Bundle bundle) {

mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}

}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onLocationChanged(Location location) {

mLastLocation = location;
if (mCurrLocationMarker != null) {
mCurrLocationMarker.remove();
}
//Place current location marker
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title("Current Position");
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
mCurrLocationMarker = mapAPI.addMarker(markerOptions);

//move map camera
mapAPI.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mapAPI.animateCamera(CameraUpdateFactory.zoomTo(11));

//stop location updates
if (mGoogleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

}

这是我从数据库获取数据并将其转换为 JSON 的代码。

fetchData.java

package com.example.defiblocator;

import android.os.AsyncTask;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class fetchData extends AsyncTask <Void,Void,Void>{

String data = "";
String json_url;
String dataParsed = "";
String singleParsed = "";



public Integer x = 0;
@Override
protected void onPreExecute(){
json_url = "http://defiblocator.ml/json_get_data.php";
}
@Override
protected Void doInBackground(Void... voids) {


try {
URL url = new URL(json_url);
HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

String line = "";
data = data + line;


while(line != null){
line = bufferedReader.readLine();
}

JSONArray JA = new JSONArray(data);
for(int i =0 ; i <JA.length(); i++){
JSONObject JO = (JSONObject) JA.get(i);
singleParsed = JO.get("name") + "," + JO.get("lat") + "," +JO.get("lng") + ",";
dataParsed = dataParsed + singleParsed ;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException | JSONException e){
e.printStackTrace();
}

return null;
}

@Override
protected void onPostExecute(Void aVoid) {
MainActivity.data.setText(dataParsed);

}
}

当我尝试将转换后的数据发送回主 Activity 以处理名称、纬度和经度时,我的错误仅发生在 PostExecute() 中。如果有比我所分享的方法更简单的方法,我将使用 3 个单独的数组来完成此操作,但否则我们将不胜感激任何帮助,因为我相信我可以将 TextView 更改为字符串并将其从那里拆分为其组成部分。

最佳答案

正如评论中提到的,您需要使用接口(interface)实现回调才能使用异步任务的结果。首先创建一个接口(interface)。

New -> Jave Class -> Interface -> CallbackInterface .java. Define the method prototypes.

CallbackInterface.java

public interface CallbackInterface {
public void onSuccess(String callbackData);
public void onFailure();
}

在您的 MainActivity 中,定义一个实现该接口(interface)的类。请注意,方法必须在此处定义,并且必须包含使用异步任务结果的代码MainActivity.java

public class MainActivity extends AppCompatActivity {
TextView data;
Button performAsync;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Add this without fail.
data = findViewById(R.id.dataTV);

performAsync = findViewById(R.id.performAsync);

performAsync.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {


//Recreating your "process"
new AsyncTaskClass(new CallbackClass()).execute();
}
});

}

/*Create a class which implements the interface. It is a good practise to have
onSuccess and onFailure methods */
public class CallbackClass implements CallbackInterface {

@Override
public void onSuccess(String callbackData) {
//do your callback functions here. In your case, setting the textview to result of parsed data.
data.setText(callbackData);
}

@Override
public void onFailure() {

}
}

}

最后,在 fetchData 类(我的代码中为 AsyncTaskClass)中执行异步操作,最后在 postExecute 中使用适当的参数调用 onSuccess 方法。请注意,您应该将该类作为参数传递给 fetchData 类,并使用构造函数将其分配给接口(interface)的实例。AsyncTaskClass.java

public class AsyncTaskClass extends AsyncTask {
CallbackInterface callbackInterface;
String dataParsed;
public AsyncTaskClass(CallbackInterface callbackInterface) {
this.callbackInterface = callbackInterface;
}

@Override
protected Object doInBackground(Object[] objects) {
dataParsed = "Processed Data";
return null;
}

@Override
protected void onPreExecute() {
dataParsed = "";
}

@Override
protected void onPostExecute(Object o) {
callbackInterface.onSuccess(dataParsed);
}
}
<小时/>

虽然这看起来太多了,但这是 AsyncTaskClass 和使用它的类之间进行通信的唯一方法。如果您无法理解,请随时要求澄清。我在我的项目中检查了上面的答案,它运行得很好。

关于java - 如何修复空对象引用上的 'void android.widget.TextView.setText(java.lang.CharSequence)'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62213662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com