Code Bye

请问 关于 类如何跟activity 通信

 

请问   如果在 activity 里边 实例化一个类,然后调用此类的函数get(),而这个函数是启动一个线程。
请问 要怎么处理   才能 告知 activity 这个线程已经把数据取下来了呢?

麻烦会的朋友帮忙回复,谢啦
     

比如:
public class ArticleDetailActivity extends Activity {  

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
                。。。。。
             ma = new a();
            a.get();

}

public class a {
    
    public get  () {
。。
       if(mDetailThread == null) {
mDetailThread = new DetailThread();
mDetailThread.start(); 
}  
。。。
   }
     
       private class ArticleDetailThread extends Thread {
 
public void run() {
Log.i(TAG, “yong: BEGIN ArticleDetailThread “);
try {
                                 。。。
list1 = mHttpApi.detail(string,id);
。。。。。。。。。。。。。。。。。

Message mes = mHandler.obtainMessage(3);
mHandler.sendMessage(mes);
} catch ( Exception e) {
e.printStackTrace();
}
}
 }

}


3分
Handler 通知回 Activity 数据下载完成
引用 1 楼 u011070145 的回复:

Handler 通知回 Activity 数据下载完成

@u011070145   谢谢您的回复   麻烦再帮忙回复

请问 如果在 线程里边  给 类a的 list1  赋值了, 那么 activity 怎样才可以获得这个list的内容呢?

在  

public class a {
     
     public get  () {
。。
       if(mDetailThread == null) {
 mDetailThread = new DetailThread();
 mDetailThread.start(); 
 }  
。。。
   }
      
        private class ArticleDetailThread extends Thread {
   
 public void run() {
 Log.i(TAG, “yong: BEGIN ArticleDetailThread “);
 try {
                                  。。。
list1 = mHttpApi.detail(string,id);
。。。。。。。。。。。。。。。。。

Message mes = mHandler.obtainMessage(3);
 mHandler.sendMessage(mes);
 } catch ( Exception e) {
 e.printStackTrace();
 }
 }
  }

 } 


3分
1 在类a 中写个 方法  public List<> getList …..  return list
2 msg.obj = list; 在Activity中 获取出来  List = msg.obj

3分
interface Callback {
    public void onDone(Object result, String msg, int errorCode);
}
public class A extends Thread { 
    Callback callback;
    public A(Callback callback){
           this.callback = callback;
    }
     public void run() {
         //做完事情回调一下函数
          callback.onDone(xxx,xxx,xxx);
     }
}

class MyActivity extends Activity {
            public void onCreate() {


                    A a = new A(callback);
                     a.start();
             }

              Callback callback = new Callback() {
                           public void onDone(Object result, String msg, int errorCode) {
                                   //可以处理UI数据,用UI线程
                            }
              };
}


3分
来个简单的,类A单实例 随便在哪儿都能调用A的方法
引用 4 楼 birdsaction 的回复:
interface Callback {
    public void onDone(Object result, String msg, int errorCode);
}
public class A extends Thread { 
    Callback callback;
    public A(Callback callback){
           this.callback = callback;
    }
     public void run() {
         //做完事情回调一下函数
          callback.onDone(xxx,xxx,xxx);
     }
}

class MyActivity extends Activity {
            public void onCreate() {


                    A a = new A(callback);
                     a.start();
             }

              Callback callback = new Callback() {
                           public void onDone(Object result, String msg, int errorCode) {
                                   //可以处理UI数据,用UI线程
                            }
              };
}

birdsaction  谢谢您的回复
 麻烦再帮忙回复下。

代码里边有以下三个文件:
src/com/example/b/ Callback.java
src/com/example/b/ test.java
src/com/example/b/ MainActivity.java
但是运行的时候 会出现提示
04-02 09:37:45.394: E/AndroidRuntime(7529): java.lang.NullPointerException
04-02 09:37:45.394: E/AndroidRuntime(7529):  at com.example.b.test.run(test.java:17)

即在   callback.onDone(1,2,3);  在这行报错。

在 Callback.java  代码如下:
package com.example.b;

public interface Callback {
//public void onDone(Object result, String msg, int errorCode);

public void onDone(int result, int msg, int errorCode);
}

在 test.java 代码如下:
package com.example.b;

import android.util.Log;

public class test extends Thread {
private static final String TAG = “test”;
Callback callback;
    public test(Callback callback){
           this.callback = callback;
    }
     public void run() {
         //做完事情回调一下函数
      Log.d(TAG,”yong++: public void run() “);
          callback.onDone(1,2,3);
     }
}

在 MainActivity.java 代码如下:

public class MainActivity extends ActionBarActivity {
Callback callback;
private static final String TAG = “MainActivity”;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        test a = new test(callback);
         a.start();
         
         Callback callback = new Callback() {
            // public void onDone(Object result, String msg, int errorCode) {
             
            public void onDone(int result, int msg, int errorCode) {  
                     //可以处理UI数据,用UI线程
             Log.d(TAG,”++: ondone result=”+result);
              }
         };
       }
 }
}


3分
 Callback callback = new Callback() {
            // public void onDone(Object result, String msg, int errorCode) {
             
            public void onDone(int result, int msg, int errorCode) {  
                     //可以处理UI数据,用UI线程
             Log.d(TAG,”++: ondone result=”+result);
              }
         };
这个代码要放到  test a = new test(callback);前面,或者放到onCreate方法的外面,否则空异常。
引用 7 楼 birdsaction 的回复:

 Callback callback = new Callback() {
            // public void onDone(Object result, String msg, int errorCode) {
             
            public void onDone(int result, int msg, int errorCode) {  
                     //可以处理UI数据,用UI线程
             Log.d(TAG,”++: ondone result=”+result);
              }
         };
这个代码要放到  test a = new test(callback);前面,或者放到onCreate方法的外面,否则空异常。

@  birdsaction  非常感谢您的回复。 按您所说的,可以正常运行了。但是我还有不明白的地方,麻烦再回复下,谢啦

比如说   Callback  是一个接口, 是不能实例化的。但是Callback callback = new Callback() {}  这样写 new 能理解为实例化吗?
如果能的话,这不跟 接口不能实例化 矛盾了吗?

还有就是
test a = new test(callback);
          a.start();
这个地方启动了一个 线程, 那么 这个线程是否需要把它 杀死呢?  还是 一直就让这个线程运行着呢?
谢啦


3分
这个是基础啊,接口实例化可以这样写的,你可以去看看JAVA基础。
线程如果run方法执行结束的话,虚拟机会回收的。你没有写循环体,不会长期运行的,。
引用 9 楼 birdsaction 的回复:

这个是基础啊,接口实例化可以这样写的,你可以去看看JAVA基础。
线程如果run方法执行结束的话,虚拟机会回收的。你没有写循环体,不会长期运行的,。

birdsaction  非常感谢您的回复。 还有个关于线程的问题,麻烦再帮忙回复下,谢谢啦

就是如果是线程间通信的话,那线程是怎么被处理的呢? 也就是什么时候会被回收。但是 既然是进程间通信,比如点击
listview的某一项,主线程就会发信息给  子线程,这样的话,子线程就不应该被回收的。 难道它就一直被运行着吗?

比如代码可以这样写 进程间通信:
public class HiActivity extends Activity {

protected void onCreate(Bundle savedInstanceState) {
        
。。。。
。。。。// 这里启动了一个 线程 HiThread
if(mHiThread == null) {
mHiThread= new HiThread();
mHiThread.start(); 
}
listView11.setOnItemClickListener( new OnItemClickListener() {

public void onItemClick(AdapterView<?>arg0,View arg1, int arg2,long arg3) { //arg2 is  position
                   。。。。。
   id = 3;
     Message mes = aThreadHandler.obtainMessage(MSG_WIN,id);
     aThreadHandler.sendMessage(mes); //发送信息给子线程
}

private final Handler mHandler = new Handler() {
public void handleMessage(Message msg) {/接收从子线程发送的信息
switch (msg.what) {
case 1:
Log.d(TAG,”case 1  “);

break;

default:
break;
}
super.handleMessage(msg);
}
    };
    
     
     private class HiThread extends Thread {
 
public void run() {

Looper.prepare();  
try {
list1 = 2;
                           。。。。。
Message mes = mHandler.obtainMessage(1);
mHandler.sendMessage(mes); //发信息给 主线程

aThreadHandler = new Handler() {
 public void handleMessage(Message msg) {  //子线程  收到主线程发来的信息
////进行操作;
 switch (msg.what) {
                case MSG_WIN:
                 Log.d(TAG,”: case MSG_WIN: “);

                 break;
                default:
                    break;
            }
 }
    };
    Looper.loop();
} catch ( Exception e) {
e.printStackTrace();
}
}
 }  
}

     


2分
你这不是进程通信,只是线程通信。如果你自己创建的线程里面 创建了自己的loop(); 这个线程就不会被回收。
这个需要你自己处理,什么时候不用了。
引用 11 楼 birdsaction 的回复:

你这不是进程通信,只是线程通信。如果你自己创建的线程里面 创建了自己的loop(); 这个线程就不会被回收。
这个需要你自己处理,什么时候不用了。

birdsaction   非常感谢您的回复。  最后还想确认一个问题,麻烦再帮忙回复下,谢啦
就是 如果是弄了 线程间通信的话,如果我想在activity在 调用onStop()的时候,把线程杀死的。 
那么以下我写的这段代码 是用于杀死线程的, 请问 这样写  有问题吗?

protected void onStop() {
 
  super.onStop();
  if( mHiThread != null ) {
  Thread tempthread = mHiThread;
  mHiThread = null;
  tempthread.interrupt();
  }
  }


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请问 关于 类如何跟activity 通信