2013-03-18 50 views
0

我试图处理AsyncTaskLoader。我实现了接口LoaderCallbacks如下:AsyncTaskLoader不正确的方法调用onLoadFinished

public class MainActivity extends Activity implements LoaderCallbacks<String> { 
... 
... 
@Override 
public Loader<String> onCreateLoader(int id, Bundle args) { 
    Log.w("loader","onCreate"); 
    return new JSONLoader(this); 
} 


@Override 
public void onLoadFinished(Loader<String> arg0, String arg1) { 
     Log.w("loader","finish"); 

} 

@Override 
public void onLoaderReset(Loader<String> arg0) { 
    Log.w("loader","onReset"); 
    // TODO Auto-generated method stub 

} 


public void useLoader() { 

    Log.w("loader","useLoader"); 
     Bundle args = new Bundle(); 
     // ... 
     // fill in args 
     // ... 


     Loader loader = 
     this.getLoaderManager().initLoader(0, args, this); 

     Log.w("HashLoader",String.valueOf(loader.hashCode())); 
     // with support library: 
     // Loader loader = 
     // context2.getSupportLoaderManager().initLoader(0, args, this); 
     // call forceLoad() to start processing 
     loader.forceLoad(); 

    } 

我得到一个挂事件按钮:

btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      useLoader(); 
     } 
    }); 

当我按下按钮第一时间的方法onLoadFinished()被加载后调用。但是当第二次按下按钮时,它会调用第一个onLoadFinished()。

的logcat:

useLoader 
onCreate 
1087415440 
good 
finish 
useLoader 
finish 
1087415440 
good 

一些关于AsyncTaskLoader:

public class JSONLoader extends AsyncTaskLoader<String> { 

public JSONLoader(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public String loadInBackground() { 
      try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    Log.w("loader","good"); 
     return " ";} 

为什么方法onLoadFinished()不等待线程的结束?

回答

3

我认为initLoader功能不破坏创建一个新的装载机。然后在第二次运行,您的自定义装载机已经“加载” =>它调用onLoadFinish()

试图摧毁它,并通过一个restartLoaderReference

Loader loader = this.getLoaderManager().restartLoader(0, args, this); 
更换 initLoader调用只是重新创建
相关问题