2016-09-29 90 views
0

我試圖將我的代碼更改爲android註釋。我的應用程序開始,但是當我點擊按鈕,它崩潰,出現錯誤:將代碼更改爲android註釋

FATAL EXCEPTION: main 
Process: com.example.albertpula.apka3, PID: 2523 
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ProgressBar.setVisibility(int)' on a null object reference 
    at com.example.albertpula.apka3.MainActivity$ReadPic.onPreExecute(MainActivity.java:83) 
    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:604) 
    at android.os.AsyncTask.execute(AsyncTask.java:551) 
    at com.example.albertpula.apka3.MainActivity.click(MainActivity.java:54) 
    at com.example.albertpula.apka3.MainActivity_$1.onClick(MainActivity_.java:72) 
    at android.view.View.performClick(View.java:5198) 
    at android.view.View$PerformClick.run(View.java:21147) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    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) 

這裏是代碼:

@EActivity(R.layout.activity_main) 
public class MainActivity extends Activity { 

String adres ="http://www.heavens-above.com/orbitdisplay.aspx?icon=iss&width=300&height=300&satid=25544"; 
Bitmap bmp; 
ProgressBar progressBar; 
Button button1; 
ImageView image; 
TextView text; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    image = (ImageView)findViewById(R.id.imageView); 
    button1 = (Button)findViewById(R.id.button1); 
    progressBar = (ProgressBar)findViewById(R.id.progressBar1); 
    text = (TextView)findViewById(R.id.textView1); 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 

@Click(R.id.button1) 
void click(View view){ 
    ReadPic rp = new ReadPic(); 
    rp.execute(); 
} 

class ReadPic extends AsyncTask<Void, Void, Void> 
{ 
    boolean sukces = true; 

    @Override 
    protected Void doInBackground(Void... arg0){ 
     URL u; 
     InputStream is; 
     try{ 

      u = new URL(adres); 
      is = u.openStream(); 
      Bitmap temp = BitmapFactory.decodeStream(is); 
      bmp=temp.copy(Bitmap.Config.ARGB_8888, true); 
     } 
     catch(Exception e){ 
      sukces = false; 

     } 
     return null; 
    } 

    protected void onPreExecute(){ 
     progressBar.setVisibility(ProgressBar.VISIBLE); 
     button1.setEnabled(false); 
     super.onPreExecute(); 
    } 

    protected void onPostExecute(Void result){ 
     if(sukces){ 
      Canvas c = new Canvas(bmp); 
      Paint p = new Paint(); 
      int width = bmp.getWidth(), height = bmp.getHeight(); 
      p.setColor(Color.WHITE); 
      p.setStyle(Paint.Style.STROKE); 
      c.drawRect(0,0,width-1,height-1,p); 

      image.setImageBitmap(bmp); 
      text.setText("Downloading finished, img " +width+ "x" + height); 
     } 
     else{ 
      text.setText("Error when downloading"); 
     } 
     button1.setEnabled(true); 
     progressBar.setVisibility(ProgressBar.INVISIBLE); 

     super.onPostExecute(result); 
    } 
} 
} 
+0

logcat的日誌中,方便閱讀單行排列並格式化 – Nikhil

回答

0
  1. 使用ViewBinding綁定您的XML看法是這樣的:

    @ViewById(R.id.button1)Button button1; 
    
    @ViewById(R.id.imageView)ImageView image; 
    
    @ViewById(R.id.textView1)TextView text; 
    

從您的onCreate刪除()的代碼。

  • 不要添加:

    super.onCreate(savedInstanceState); 
    
    setContentView(R.layout.activity_main); 
    
  • 對於錯誤:顯示java.lang.NullPointerException:嘗試調用虛擬方法「無效android.widget.ProgressBar。 setVisibility(INT)」上的空對象引用在

  • 選項:1個檢查它是否爲空。

    protected void onPreExecute(){ 
        if(progressBar != null) 
         progressBar.setVisibility(ProgressBar.VISIBLE); 
    
        button1.setEnabled(false); 
        super.onPreExecute(); 
    } 
    

    AND,

    button1.setEnabled(true); 
    
    if(progressBar != null) 
    progressBar.setVisibility(ProgressBar.INVISIBLE); 
    
    super.onPostExecute(result); 
    

    選項:2 - 初始化ProgressDialog

    class ReadPic extends AsyncTask<Void, Void, Void> { 
        ProgressBar progressBar; 
        boolean sukces = true; 
    
        public ReadPic(){ 
         progressBar = new ProgressBar();//Set the Theme, context & call constructor as per your choice. 
        } 
    
        //YOUR CODE GOES BELOW// 
        }//ReadPic class closes here.... 
    

    編輯1:Gorthez,實例化進度條是這樣的:

    progressBar = (ProgressBar) findViewById(R.id.progress_bar);

    還添加進度欄在你的XML:

    <LinearLayout 
         android:orientation="horizontal" 
         ... > 
         <ProgressBar 
          android:id="@+id/progress_bar" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          style="@android:style/Widget.ProgressBar.Small" 
          android:layout_marginRight="5dp" /> 
         <TextView 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:text="@string/loading" /> </LinearLayout> 
    

    EDIT1參考https://developer.android.com/reference/android/widget/ProgressBar.html

    +0

    感謝您的答覆。如果我刪除super.onCreate ...和setContentView ...應用程序崩潰。順便說一句,我可以鍵入什麼設置主題,上下文和調用構造函數(選項2)? – Gorthez

    +0

    @Gorthez:@EActivity(R.layout.activity_main)在我的代碼中工作得很好。即我的代碼不會崩潰。可能是你的gradle同步問題(可能)。不過!我已經更新了(選項2)的代碼,現在chk。 – Pawan

    +0

    非常感謝!終於工作了! :)我有最後一個問題。此代碼在tapp後僅顯示一張圖片,在1 tapp按鈕後顯示更多圖片還有很多事情要做嗎? – Gorthez

    0
    @Override 
    
    public void onCreate(Bundle savedInstanceState) 
    { 
    
        **//put setContentView and super call here 
    
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main);** 
    
        image = (ImageView)findViewById(R.id.imageView); 
        button1 = (Button)findViewById(R.id.button1); 
        progressBar = (ProgressBar)findViewById(R.id.progressBar1); 
        text = (TextView)findViewById(R.id.textView1); 
    
        //setContentView(R.layout.activity_main); 
    } 
    

    在這裏,你試圖膨脹的佈局之前訪問視圖元素。 首先通過調用setContentView(R.layout.activity_main)來擴充佈局; 然後嘗試訪問元素。

    +0

    謝謝你,它的幫助下,應用程序沒有崩潰,而且當我敲擊什麼也沒發生按鈕。任何想法還有什麼不對? 這是形式logcat 17985-17985/com.example.albertpula.apka3 I /時間線:時間線:Activity_idle id:[email protected]時間:1459738 17985-17985/com.example.albertpula.apka3 D/ViewRootImpl:ViewPostImeInputStage processPointer 0 17985-17985/com.example.albertpula.apka3 D/ViewRootImpl:ViewPostImeInputStage processPointer 1 17985-18239/com.example.albertpula.apka3 I/System.out:(HTTPLog)-Static:isSBSettingEnabled false – Gorthez

    +0

    保護無效onPreExecute(){ \t progressBar.setVisibility(ProgressBar。可見); \t // add below line \t progressBar.show(); \t \t button1.setEnabled(false); \t super.onPreExecute(); } 您應該調用progressBar.show()以使其可見 – Raman

    +0

    ups style for progressBar where missing。 我無法添加progressBar.show()「無法解析方法show()」 但仍然沒有任何反應 – Gorthez