2011-05-25 68 views
0

考虑我有一个线程作为一个单独的类,例如SimpleThread.java,android中的线程问题?

class SimpleThread extends Thread { 

    public SimpleThread(String str) { 
    super(str); 
    } 
    public void run() { 
    for (int i = 0; i < 10; i++) { 
     System.out.println(i + " " + getName()); 
      try { 
     sleep((int)(Math.random() * 1000)); 
     } catch (InterruptedException e) {} 
    } 
    System.out.println("DONE! " + getName()); 
    } 
} 

从我的Android home.java我需要启动线程,

new SimpleThread("Jamaica").start(); 

一次循环结束我需要鞋的警报,但是当我使用

authalert = new AlertDialog.Builder(this); 

它显示空指针execption,我需要一个背景在这里Thread类,有没有其他的办法做这个。

回答

4

嘿,你应该使用处理器为这个 这里是代码...解决您的问题的

ProgressDialog _progressDialog = ProgressDialog.show(this,"Saving Data","Please wait......"); 
settintAdater(); 

private void settingAdater(){ 

     Thread _thread = new Thread(){ 

      public void run() { 

       Message _msg = new Message(); 
       _msg.what = 1; 
       // Do your task where you want to rerieve data to set in adapet 
       YourCalss.this._handle.sendMessage(_msg); 
      }; 
     }; 
     _thread.start(); 
    } 
Handler _handle = new Handler(){ 

     public void handleMessage(Message msg) { 

      switch(msg.what){ 

       case 1: 
        _progressDialog.dismiss(); 
        listview.setAdapter(); 
      } 
     } 
} 
2

一种方法是使用处理程序,如Sujit建议。其他方式是使用AsyncTask。阅读here

0

的问题是:当您启动线程,编译器不会等到线程完成他treatement,他将执行下一条指令(authalert =新AlertDialog.Builder(本);

这样有两个或三个方法可以做到这一点:

1),使用处理器

2)为了定义自己的监听你的线程监听,直到他完成了他的treatement,

3),你可以通过你的活动范围,并为您的run方法的最后一行,显示AlertDialog(与Activity.runOnUiThread(new Runnable);

+0

你知道那编译器无关的Wi运行时间和具体等待? – inazaruk 2011-05-25 10:36:00

+0

对不起,我不是很好,我不知道如何解释它, 我想说的是,在执行(Thread.start();)的时刻,程序将执行接下来的指令,他不会等待线程,直到他完成处理,所以我建议在你的线程中定义一个监听器,它将听取线程的结束,然后他可以显示AlertDialog :),你理解我? – Houcine 2011-05-25 10:47:46

0

你应该阅读http://www.aviyehuda.com/2010/12/android-multithreading-in-a-ui-environment/http://developer.android.com/resources/articles/painless-threading.html

一个方法是把一个处理器在您的通话活动:

final mContext=this; 
final Handler mHandler=new Handler(){ 

@Override 
public void handleMessage(Message msg) { 
    int yourIntReturnValue=msg.what; 
    //cast your object back to whatever it was lets say it was a string: 
    // String yourString=(String) msg.obj; 
    //do something like authalert = new AlertDialog.Builder(mContext); 


} 
}; 

然后

class SimpleThread extends Thread { 
    Handler mHandler; 

public SimpleThread(String str, Handler h) { 

super(str); 
mHandler=h; 
} 
public void run() { 
for (int i = 0; i < 10; i++) { 
System.out.println(i + " " + getName()); 
try { 
sleep((int)(Math.random() * 1000)); 
} catch (InterruptedException e) {} 
} 
System.out.println("DONE! " + getName()); 
Message.obtain(mHandler, someIntRetValue, 
       "DONE" ).sendToTarget(); 


} 
}