2017-05-12 62 views
-3

我得到一個應用程序,它可以計數到10並在textView中顯示每個數字。它只是另一個代碼的樣本。但問題是:當我啓動應用程序時,沒有什麼可用於查看時間,然後發出消息「應用程序沒有響應」。日誌說「應用程序可能在其主線程上做了很多工作」。當我搜索時,我發現主題「通過新線程/處理程序更新TextView」有很多問題和答案,並且我嘗試了很多示例 - 但沒有任何效果。我是編程新手,希望有人能告訴我什麼是錯的。也許它很容易,但我不知道如何得到它。謝謝你的幫助!這裏是例子的代碼:應用程序可能會在其主線程上做很多工作

package de.androidnewcomer.animation; 

import android.os.Bundle; 
import android.os.Handler; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

import static de.androidnewcomer.animation.R.id.textView; 

public class MainActivity extends AppCompatActivity implements View.OnClickListener,Runnable { 
private TextView textView; 
private int i; 
private Handler handler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button button=(Button)findViewById(R.id.button); 
    button.setOnClickListener(this); 
    handler=new Handler(); 
} 
@Override 
public void run() { 
    count(); 
} 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.button: 
      count(); 
      break; 
    } 
} 
public void count() { 
    while (i < 10) { 
     TextView textView = (TextView) findViewById(R.id.textView); 
     textView.setText("" + i); 
     handler.postDelayed(this,1000); 

    } 
} 
} 

編輯:我更新計數() - 方法,增加INT我但現在的產量也只有「10」 ...感謝您的快速解答!這裏是現在的方法:

public void count() { 
i=0; 
while (i < 10) { 
    i++; 
    TextView textView = (TextView) findViewById(R.id.textView); 
    textView.setText("" + i); 
    handler.postDelayed(this,1000); 

} 
} 

該應用程序必須顯示在TextView中每秒鐘從一到十的數字。 但是,當我啓動應用程序,它只顯示十。 感謝您的幫助

+3

因爲我從來沒有增加,你有一個無限循環。 –

+1

在你的while循環中加入'i ++;' – Denny

回答

-1

您應該在GUI應用程序的上下文中爲長時間運行的操作創建一個單獨的線程。請看一看Android-API

public void onClick(View v) { 
new Thread(new Runnable() { 
    public void run() { 
     // a potentially time consuming task 
     final Bitmap bitmap = 
       processBitMap("image.png"); 
     mImageView.post(new Runnable() { 
      public void run() { 
       mImageView.setImageBitmap(bitmap); 
      } 
     }); 
    } 
}).start(); 

}

最重要的事情是這樣的:

mImageView.post(new Runnable() { 
     public void run() { 
      mImageView.setImageBitmap(bitmap); 
     } 
    }); 

有創建一個新的線程,讓您的UI響應,並在同一時間內完成任務。

+0

thansk for downvote的正確答案;) –

+0

在後臺線程中加入「我從不增加」的位,我肯定會加註。 –

+1

唯一的是,這不是正確的答案。問題在於它是一個無限循環,因爲他的變量'i'永遠不會增加。這根本不能解決問題。 – Denny

1

你不會在你的代碼中增加i變量。所以,雖然(我< 10){}是一個無限循環。

0

您的代碼中沒有增加i的值。你可以這樣做:

while (i < 10) { 
    TextView textView = (TextView) findViewById(R.id.textView); 
    textView.setText("" + i); 
    i++; 
    handler.postDelayed(this,1000); 

} 
2

首先,我沒有明顯增加,因此你有無限循環。糾正它。

二,不要再撥打findViewById()。這是相當耗時。 調用一次,然後在onCreate()中初始化TextView一次。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button button=(Button)findViewById(R.id.button); 
    button.setOnClickListener(this); 

    // Like this 
    TextView textView = (TextView) findViewById(R.id.textView); 

    handler=new Handler(); 
} 

第三,做任何這樣的長時間運行的操作背景,像using an Async task。例如:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
    protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100)); 
      // Escape early if cancel() is called 
      if (isCancelled()) break; 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 

    protected void onPostExecute(Long result) { 
     showDialog("Downloaded " + result + " bytes"); 
    } 
} 

所以,你的情況,更新TextView與我的增加值在onPostExecute()(如果你想一下子增加和更新一次)或onProgressUpdate()(如果你想有所增加,後在之間進行)

推薦閱讀The application may be doing too much work on its main thread

相關問題