簡體   English   中英

如何從其他類引用MainActivity中的任何對象? 以及如何避免NullPointerException引用任何對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM