如何在android中的单独线程中访问网络单例对象?

时间:2015-03-28 11:30:30

标签: android multithreading networking

我的单身网络对象:

public class Communication implements Runnable{

    private static Communication mInstance = null;

    private BufferedOutputStream socketOutput = null;
    private PrintWriter printOut = null;
    private Socket socket = null;
    private Scanner reader = null;          

   public static Communication getInstance(){
        if(mInstance == null)
        {
            mInstance = new Communication();
        }
        return mInstance;
    }  

    public void login()
    {  //login functionality
         }
    public void run()
    {
        //connect to server using loopback address
        try{
            socket = new Socket("192.168.0.3", 4242);

            //set inputs and out puts
            socketOutput = new BufferedOutputStream(socket.getOutputStream());
            printOut = new PrintWriter(socket.getOutputStream(), true);
            reader = new Scanner(socket.getInputStream());
        }
        catch( UnknownHostException uhe){
            uhe.printStackTrace();
        }
        catch( IOException ex){
            ex.printStackTrace();
        }
    }
}

我想要实例化此对象的MainActivity

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Thread(Communication.getInstance()).start();  
  }
}

那部分工作正常。我在新线程中实例化通信对象并建立连接。现在我想从另一个活动访问该对象,除非我再次在新线程中执行getInstance(),否则我会收到NetworkOnMainThread异常。

  1. 这是否意味着每次我想使用我的网络对象时我都要开始一个新线程?

  2. 如果(1)是肯定的: 如何从主线程访问Communication.getInstance()。login()的返回值并将其放在视图对象中?

0 个答案:

没有答案