[英]How do I refer to any object in MainActivity from other class? and how do I avoid NullPointerException for referencing to any object
onPostExecute()-NullPointerException:尝试在空对象ref上调用v.method'android.view.Window $ Callback android.view.Window.getCallback()'。
空指针Exception(onPostExecute()-NullPointerException:尝试在set方法(MainActivity)或postExecute方法(img加载)上调用v.method'android.view.Window $ Callback)。
我正在尝试加载图像并将其设置为mainactivity中的imageview。 但我不能提到那个imageview。
我不能从imageload类引用该imageview,但可以从mainactivity中的任何方法引用它。
这是MainActivity:
public class MainActivity extends AppCompatActivity {
ImageView imageView;
Context context;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
textView = (TextView) findViewById(R.id.textView);
}
public void network(View view) {
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
// fetch data
Toast.makeText(this, "Network detected", Toast.LENGTH_SHORT).show();
String stringUrl = "http://www.lorempixel.com/420/240/";
new imgLoad().execute(stringUrl);
} else {
// display error
Toast.makeText(this, "No network detected", Toast.LENGTH_SHORT).show();
// textView.setText("No network connection available.");
}
}
public void set(Bitmap bitmap) {
textView = (TextView) findViewById(R.id.textView);
if (textView != null) {
textView.setText("setting image..");
}
Toast.makeText(this, "setting..,", Toast.LENGTH_SHORT).show();
if (imageView != null) {
Toast.makeText(this, "good", Toast.LENGTH_SHORT).show();
textView.setText("image not null..");
imageView.setImageBitmap(bitmap);
}else {
textView.setText("null");
}
}
在这里,对set方法的引用为null,并且不能在ImageView的以下类上获得引用。
这是Imageloader类:
public class imgLoad extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
return load(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
MainActivity m = new MainActivity();
// ImageView c = m.x();
m.set(bitmap);
// Toast.makeText(MainActivity.getContext(), "downloaded", Toast.LENGTH_SHORT).show();
// if (c!=null) {
// c.setImageBitmap(bitmap);
// }
}
private Bitmap load(String param) {
Bitmap bitmap = null;
InputStream inputStream;
try {
URL url = new URL(param);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("Get");
httpURLConnection.setConnectTimeout(4000);
httpURLConnection.setReadTimeout(2000);
httpURLConnection.setDoInput(true);
httpURLConnection.connect();
inputStream = httpURLConnection.getInputStream();
bitmap = BitmapFactory.decodeStream(inputStream);
} catch (MalformedURLException e) {
Log.e("error", "wrong url : " + e.getMessage());
// e.printStackTrace();
} catch (IOException e) {
// e.printStackTrace();
Log.e("error", "failed : " + e.getMessage());
}
return bitmap;
}
}
这是Logcat:
12-13 10:15:53.234 28054-28127/com.facebook.mahmud.r.pixels E/error: failed : Expected one of [OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, PATCH] but was Get
12-13 10:15:53.347 28054-28054/com.facebook.mahmud.r.pixels D/AndroidRuntime: Shutting down VM
12-13 10:15:53.364 28054-28054/com.facebook.mahmud.r.pixels E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.facebook.mahmud.r.pixels, PID: 28054
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:68)
at android.support.v7.app.AppCompatDelegateImplV7.<init>(AppCompatDelegateImplV7.java:145)
at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:28)
at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:41)
at android.support.v7.app.AppCompatDelegateImplV23.<init>(AppCompatDelegateImplV23.java:29)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:186)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:170)
at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:502)
at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:174)
at com.facebook.mahmud.r.pixels.MainActivity.set(MainActivity.java:151)
at com.facebook.mahmud.r.pixels.imgLoad.onPostExecute(imgLoad.java:35)
at com.facebook.mahmud.r.pixels.imgLoad.onPostExecute(imgLoad.java:20)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
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)
12-13 10:15:56.700 28054-28054/com.facebook.mahmud.r.pixels I/Process: Sending signal. PID: 28054 SIG: 9
TIA。
让我们以正确的格式提出您的问题。 运行应用程序时,您为MainActivity
创建了一个对象。 让我们称之为mainActivityObject1
。 从mainActivityObject1
您为imgLoad
类创建了一个对象。 在下载映像之后,您为MainActivity
创建了另一个对象(我们将其mainActivityObject2
)。 现在,您尝试调用方法mainActivityObject2.set(bitmap);
您应该在哪里调用mainActivityObject1.set(bitmap);
。
您可以通过两种方法解决此问题。 但是最基本的方法是通过活动上下文。
在imgLoad类中创建一个构造函数,并按如下所示更改您的onPostExecute方法:
private MainActivity mainActivityContext;
public imgLoad(MainActivity passedActivityContext){
this.mainActivityContext = passedActivityContext;
}
@Override
protected Bitmap doInBackground(String... params) {
return load(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
mainActivityContext.set(bitmap);
}
在实例化imgLoad时从MainActivity类中传递活动上下文,如下所示:
new imgLoad(MainActivity.this).execute(stringUrl);
现在,当您从imgLoad类调用set(Bitmap bitmap)
,它应该调用创建imgLoad对象的原始MainActivity对象。
注意:
我还注意到您在此处发布的MainActivity类中没有调用
network
方法。 请调用它以进行正确测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.