Android从第二类调用类函数

时间:2013-08-16 14:08:24

标签: java android class function-calls

如何从#B类中调用#A类中定义的函数? Class#B扩展了AsynchTask并从Web服务获取远程数据。我尝试从类#B调用的类#A函数用于发送检索到的#A类远程数据以进行显示。

我正在尝试使用this将类#A的当前实例传递给类#B,但这只是传递了上下文,因此无法识别函数。

我也尝试使用static但是当函数运行一个新线程时,将函数定义为static会生成编译器错误。

我试图调用的代码如下:

public void test(List<DATA> Data){
        this.Data = Data;
        runOnUiThread(new Runnable() {          

            @Override
            public void run() {
                // TODO Auto-generated method stub
                for(DATA data : MainActivity.this.Data){
                    Toast.makeText(MainActivity.this, data.title, Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

4 个答案:

答案 0 :(得分:0)

From your question, I understood that u want to show the result of asynctask in another class. You can use onProressUpdate api of asynctask. You can do the work in doInBackground and then call publishProgress(value) whihc in turn calls onProgressUpdate and run on UI thred.

 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]);
     }

其他方式:

您可以在#A类中定义一个处理程序,并从类#B

中调用它
Sorry if i mis understood your question.

答案 1 :(得分:0)

据我所知,你是从一个AsyncTask B开始的,因为网页提取只能在Android中以异步方式工作。您希望A中的对象可以访问获取的结果。

A代码会像这样。

public class A extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        TextView fetch = (TextView) findViewById(R.id.fetch);
        new B(getApplicationContext(),fetch).execute();
        // This will update a TextView when fetching is done.
    }
}

public class B extends AsyncTask<Void, Integer, Void> {
    Context c;
    TextView f;
    public B(Context c, TextView f) {
        super();
        this.f = f;
        this.c = c;
    }


    @Override
    protected Void doInBackground(Void... params) {
        // TODO: the fetching: fetch()
        String t = fetch();
        f.setText();
        return null;
    }
}

你可以使用pre和post执行方法做其他技巧。我希望我能帮忙!

答案 2 :(得分:0)

你可以建立一个界面即:。

public interface RecieveDataDelegate {

    public void receiveData(Object dataFromWebService, boolean success);
}

有#A类实现接口。当从类#A调用asyncTask时,将自身传递给具有ReceiveDataDelegate类型参数的AsyncTask的构造函数。

new AsyncTask1 (this).execute();

使用构造函数设置AsyncTask并将数据发送回Class#A onPostExecute(),以便更新ui。

 class AsyncTask1 extends AsyncTask<Void, Void, Boolean> {
    Object dataReceived ;
    protected RecieveDataDelegate delegate;

    public AsyncTask1 (RecieveDataDelegate delegate) {
        this.delegate = delegate;
    }
    protected Boolean doInBackground(Void... params) {
      //do your service request and set dataRecieved
    }
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        delegate.RecieveDataDelegate (dataReceived, result.booleanValue());
    }

这样,任何实现接口的类都可以使用相同的asyncTask。

答案 3 :(得分:0)

这就是你要做的:

在MainActivity中:

ClassBAsyncTask mat = new ClassBAsyncTask(this, .., ..);

ClassBAsyncTask的构造函数:

public ClassBAsyncTask(MainActivity context, .., ..) {
    mContext = context;
    ....
    ....
}

test(List<DATA>)内调用MainActivity的方法ClassBAsyncTask

((MainActivity)mContext).test(yourListVariable);

查看弱引用,以确保当活动不再存在时AsyncTask不使用mContext