简体   繁体   English

Android AsyncTask,不将sharedpreference发送到套接字

[英]Android AsyncTask, doesn't send the sharedpreference to the socket

I have searched the whole site but didn't find any hint to my problem i'm trying to send some sharedpreferences through socket when i hit the button in main activity and the sharedpreferences are saved in second activity the socket is created in SocketEsp class here is my code: 我已经搜索了整个站点,但是没有找到问题的任何提示,当我在主活动中单击按钮时,我试图通过套接字发送一些共享的首选项,并且共享的首选项保存在第二个活动中,套接字是在SocketEsp类中创建的是我的代码:

MainActivity: 主要活动:

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    Button butact, butoption, butdoor;
    Intent intent;
    SharedPreferences sharedPreferences;
    private static Socket socket;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(this, SecondActivity.class);
        butact = (Button)findViewById(R.id.butAct);
        butdoor = (Button)findViewById(R.id.doorbut);
        butoption = (Button)findViewById(R.id.optbut);
        sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
        butoption.setOnClickListener(option);
        butact.setOnClickListener(fire);
        //checkConnect();

    }


    private void checkConnect(){
        String strSavedMem1 = sharedPreferences.getString("MEM1", "");
        String strSavedMem2 = sharedPreferences.getString("MEM2", "");
        String strSavedMem3 = sharedPreferences.getString("MEM3", "");

        if(strSavedMem1.isEmpty() | strSavedMem2.isEmpty() | strSavedMem3.isEmpty())
        {
            startActivityForResult(intent, 1);
        }
        else{
            wifiConnect();
            }
        }

    public void wifiConnect(){
        String strSavedMem1 = sharedPreferences.getString("MEM1", "");
        String strSavedMem2 = sharedPreferences.getString("MEM2", "");
        WifiManager wifiManager = (WifiManager) MainActivity.this.getSystemService(Context.WIFI_SERVICE);
        WifiConfiguration config = new WifiConfiguration();
        config.status = WifiConfiguration.Status.ENABLED;
        config.SSID = "\"" + strSavedMem1 + "\"";
        config.preSharedKey = "\""+ strSavedMem2 +"\"";
        wifiManager.setWifiEnabled(true);
        int networkId = wifiManager.addNetwork(config);
        wifiManager.enableNetwork(networkId, true);
    }

    Button.OnClickListener option = new Button.OnClickListener(){

        @Override
        public void onClick(View arg0) {
            startActivity(intent);
        }
    };

    Button.OnClickListener fire = new Button.OnClickListener(){

        @Override
        public  void onClick(View arg0)
        {
            new SocketEsp("10.1.1.105",6000).execute();
        }
    };

    private void checkSsid()
    {
        String strSavedMem1 = sharedPreferences.getString("MEM1", "");
        WifiManager wifiManager = (WifiManager) MainActivity.this.getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        if (WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState()) == NetworkInfo.DetailedState.CONNECTED) {
            String ssid = wifiInfo.getSSID();
            if (!ssid.equals(strSavedMem1))
            {
                wifiConnect();
            }
        }
    }

}

EspSocket class: EspSocket类:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.preference.PreferenceManager;

public class SocketEsp extends AsyncTask<Void, Void, Void> {

    Context context;
    private static Socket socket;
    String dstAddress;
    int dstPort;

    public SocketEsp(Context context) {
        this.context = context;
    }




    SocketEsp(String addr, int port) {
        dstAddress = addr;
        dstPort = port;
    }

    @Override
    protected Void doInBackground(Void... arg0)
    {


        try
        {
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.context);
            String strSavedMem3 = prefs.getString("MEM3", "");

            socket = new Socket(dstAddress, dstPort);



            //Send the message to the server
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);


            String sendMessage2 = strSavedMem3 + "\n";
            bw.write(sendMessage2);
            bw.flush();

            /*Get the return message from the server
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String message = br.readLine();
            System.out.println("Message received from the server : " +message);*/
        }
        catch (Exception exception)
        {
            exception.printStackTrace();
        }
        finally
        {
            //Closing the socket
            try
            {
                socket.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        return  null;



    }

}

But I can't send anything: 但是我什么也不能发送:

    05-03 23:10:55.070 22368-22514/com.app.foxcorp.dcontrol W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at android.preference.PreferenceManager.getDefaultSharedPreferencesName(PreferenceManager.java:375)
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at android.preference.PreferenceManager.getDefaultSharedPreferences(PreferenceManager.java:370)
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at com.app.foxcorp.dcontrol.SocketEsp$override.doInBackground(SocketEsp.java:44)
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at com.app.foxcorp.dcontrol.SocketEsp$override.access$dispatch(SocketEsp.java)
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at com.app.foxcorp.dcontrol.SocketEsp.doInBackground(SocketEsp.java:0)
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at com.app.foxcorp.dcontrol.SocketEsp.doInBackground(SocketEsp.java:18)
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
05-03 23:10:55.071 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
05-03 23:10:55.075 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
05-03 23:10:55.075 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
05-03 23:10:55.076 22368-22514/com.app.foxcorp.dcontrol W/System.err:     at java.lang.Thread.run(Thread.java:818)

You are using this following constructor: 您正在使用以下构造函数:

SocketEsp(String addr, int port) {
    dstAddress = addr;
    dstPort = port;
}

Which has no context parameter. 没有上下文参数。 When you then do this to get shared prefs: 当您执行此操作以获取共享偏好时:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.context);

It is causing the NPE. 这导致了NPE。 You need to add the context parameter to each constructor to fix this, and pass your calling Activitiy's context. 您需要向每个构造函数添加context参数来解决此问题,并传递调用Activitiy的上下文。

new SocketEsp(MainActivity.this, "10.1.1.105",6000).execute();

SocketEsp(Context context, String addr, int port) {
    this.context = context;
    dstAddress = addr;
    dstPort = port;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM