【问题标题】:How do i resolve thread error when using Progress dialog?使用进度对话框时如何解决线程错误?
【发布时间】:2012-09-15 01:33:23
【问题描述】:

我是一个尝试学习如何正确实现进度对话框的 android 菜鸟。我从一些在 OnCreate 期间填充列表视图之前查询和解析 twitter 结果的代码开始。这工作得很好。我想添加一个进度条,因为它需要几秒钟,但是自从我添加了进度条后,我的代码就停止了工作。我在解析过程中遇到空指针错误,并且我的应用程序由于错误提示“只有创建视图层次结构的原始线程才能触及其视图”而崩溃。非常感谢任何解决此问题的帮助。

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    dialog = new ProgressDialog (MainActivity.this);
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    dialog.setMessage("Loading... please wait");
    dialog.setIndeterminate(false);
    dialog.setMax(100);
    dialog.setProgress(0);
    dialog.show();

    Runnable runnable = new Runnable() {
        @Override
        public void run() {

    tweets = new ArrayList<Tweet>();

    try {           
        JSONObject jArray = JSONfunctions.getJSONfromURL("http://search.twitter.com/search.json?q=gold%20silver%20news&rpp=15");
        JSONArray parsedTwitter = jArray.getJSONArray("results");       
        if(parsedTwitter.equals("") ){
            Toast.makeText(MainActivity.this, "No nearby locations", Toast.LENGTH_LONG).show();
        }else{
            for (int i = 0; i < parsedTwitter.length(); i++) {
            JSONObject parsedspecific = parsedTwitter.getJSONObject(i);             
        if (i == 0){                
            String from_user = parsedspecific.getString("from_user");
            String text = parsedspecific.getString("text"); 
            String profile_image_url = parsedspecific.getString("profile_image_url");  
            Tweet tweet0 = new Tweet(from_user, text, profile_image_url );
            tweets.add(tweet0);                 
            }
dialog.setProgress(50);
        if (i == 1){                
            String from_user = parsedspecific.getString("from_user");
            String text = parsedspecific.getString("text"); 
            String profile_image_url = parsedspecific.getString("profile_image_url");  
            Tweet tweet1 = new Tweet(from_user, text, profile_image_url );
            tweets.add(tweet1);                 
            }

      }
            }

    } catch (Exception e) {
        Log.e("log_tag", "Error parsing data "+ e.toString());
    }

    ListView listView = (ListView) findViewById(R.id.ListViewId);      
    listView.setAdapter(new UserItemAdapter(MainActivity.this, R.layout.listitem, tweets));


    dialog.setProgress(100);
    dialog.dismiss();
        }
    };

    new Thread(runnable).start();


}

【问题讨论】:

    标签: android multithreading view nullpointerexception progress-bar


    【解决方案1】:

    这意味着对话框在不同的线程中,你需要一个处理程序来处理它,尝试在 OnCreate() 方法之前添加下一行:

    Handler handler;
    

    然后在 OnCreate 方法上,实例化处理程序,使其与对话框在同一个线程中

    handler = new Handler();
    

    最后,要从不同的线程更新对话框,您需要像这样使用处理程序:

    handler.post(new Runnable(){
    public void run(){
    //Do here whatever you want to do to the dialog
    dialog.setProgress("whatever integer");
    }
    });
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      在Android中,你应该只做Main Thread中的那种UI操作,这是默认线程。否则,您将收到您现在遇到的错误。尝试学习如何使用HandlerAsyncTask在单独的线程中进行长进度操作。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      相关资源
      最近更新 更多