我搜索了整个网站,但没有找到任何提示我的问题我试图通过套接字发送一些共享偏好当我点击主要活动中的按钮并且共享偏好保存在第二个活动中套接字创建于这里的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类:
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;
}
}
但我不能发送任何东西:
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)
答案 0 :(得分:0)
您正在使用以下构造函数:
SocketEsp(String addr, int port) {
dstAddress = addr;
dstPort = port;
}
没有上下文参数。当你这样做以获得共享的首选项时:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.context);
它正在引起NPE。您需要将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;
}